QuartzService.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package com.jiayue.ipfcst.console.service;
  2. import com.jiayue.ipfcst.common.core.exception.BusinessException;
  3. import com.jiayue.ipfcst.common.data.entity.InverterInfo;
  4. import com.jiayue.ipfcst.common.data.entity.Quartz;
  5. import com.jiayue.ipfcst.common.data.repository.QuartzRepository;
  6. import com.jiayue.ipfcst.common.data.service.BaseService;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.quartz.SchedulerException;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.core.io.ClassPathResource;
  12. import org.springframework.core.io.support.EncodedResource;
  13. import org.springframework.data.domain.Page;
  14. import org.springframework.data.domain.PageRequest;
  15. import org.springframework.data.domain.Pageable;
  16. import org.springframework.data.jpa.domain.Specification;
  17. import org.springframework.jdbc.datasource.init.ScriptUtils;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Propagation;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import javax.persistence.criteria.Predicate;
  22. import java.sql.Connection;
  23. import java.sql.DriverManager;
  24. import java.sql.SQLException;
  25. import java.util.*;
  26. /**
  27. * 定时逻辑
  28. *
  29. * @author bizy
  30. * @version 1.0
  31. * @since 2018/10/22 11:29
  32. */
  33. @Service
  34. @Slf4j
  35. public class QuartzService extends BaseService {
  36. private final QuartzRepository quartzRepository;
  37. @Value("${spring.datasource.druid.username}")
  38. private String username;
  39. @Value("${spring.datasource.druid.password}")
  40. private String password;
  41. @Value("${spring.datasource.druid.driver-class-name}")
  42. private String driverClassName;
  43. @Value("${spring.datasource.druid.url}")
  44. private String url;
  45. @Autowired
  46. public QuartzService(QuartzRepository quartzRepository) {
  47. this.quartzRepository = quartzRepository;
  48. }
  49. /**
  50. * 根据执行类查询
  51. *
  52. * @param executeClass 执行类
  53. * @return Quartz
  54. */
  55. @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
  56. public Quartz findByClass(
  57. String executeClass) {
  58. return quartzRepository.findByExecuteClass(executeClass);
  59. }
  60. /**
  61. * 保存/更新
  62. *
  63. * @param qt 任务实体
  64. */
  65. @SuppressWarnings({"finally", "ReturnInsideFinallyBlock"})
  66. @Transactional(propagation = Propagation.REQUIRED)
  67. public boolean save(Quartz qt) {
  68. boolean flag = false;
  69. try {
  70. flag = updateState(qt);
  71. } catch (Exception e) {
  72. log.error("系统错误", e);
  73. }
  74. return flag;
  75. }
  76. /**
  77. * 删除
  78. *
  79. * @param ids id集合
  80. * @return boolean
  81. */
  82. @Transactional(propagation = Propagation.REQUIRED)
  83. public boolean deleteById(String ids) {
  84. boolean flag = false;
  85. try {
  86. if (!ids.isEmpty()) {
  87. String[] id = ids.split(",");
  88. if (null != id && id.length > 0) {
  89. for (String did : id) {
  90. Optional<Quartz> optional = quartzRepository.findById(Integer.parseInt(did));
  91. if (optional.isPresent()) {
  92. Quartz quartz = optional.get();
  93. deleteJob(quartz.getJobName());
  94. quartzRepository.delete(quartz);
  95. } else {
  96. throw new BusinessException("定时任务不存在!");
  97. }
  98. }
  99. } else {
  100. Optional<Quartz> optional = quartzRepository.findById(Integer.parseInt(ids));
  101. if (optional.isPresent()) {
  102. Quartz quartz = optional.get();
  103. deleteJob(quartz.getJobName());
  104. quartzRepository.delete(quartz);
  105. } else {
  106. throw new BusinessException("定时任务不存在!");
  107. }
  108. }
  109. flag = true;
  110. }
  111. } catch (Exception e) {
  112. log.error("系统错误", e);
  113. }
  114. return flag;
  115. }
  116. /**
  117. * 根据条件查询定时任务
  118. *
  119. * @param jobName 任务名
  120. * @param page 页码
  121. * @param size 每页多少条
  122. * @return map
  123. */
  124. @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
  125. public Map<String, Object> getQuartz(
  126. String jobName, String jobType, Integer page, Integer size) throws SchedulerException {
  127. Map<String, Object> map = new HashMap<>();
  128. Specification<Quartz> specification = this.getDemoQuerySpecification(jobName, jobType);
  129. //分页信息
  130. Pageable pageable = PageRequest.of(page - 1, size); //页码:前端从1开始,jpa从0开始,做个转换
  131. Page pageUser = quartzRepository.findAll(specification, pageable);
  132. List<Quartz> quartzs = pageUser.getContent();// 结果集
  133. if (null != quartzs && quartzs.size() > 0) {
  134. for (Quartz quartz : quartzs) {
  135. quartz.setJobState(getJobStatus(quartz.getJobName()));
  136. quartz.setLaetFireTime(getJobPreviousFireTime(quartz.getJobName()));
  137. }
  138. }
  139. quartzRepository.saveAll(quartzs);
  140. map.put("emps", quartzs);// 结果集
  141. map.put("count", pageUser.getTotalElements());// 总记录数
  142. return map;
  143. }
  144. @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
  145. public List<Quartz> getAll() throws SchedulerException {
  146. List<Quartz> quartzs = quartzRepository.findAll();
  147. if (null != quartzs && quartzs.size() > 0) {
  148. for (Quartz quartz : quartzs) {
  149. quartz.setJobState(getJobStatus(quartz.getJobName()));
  150. quartz.setLaetFireTime(getJobPreviousFireTime(quartz.getJobName()));
  151. }
  152. }
  153. return quartzs;
  154. }
  155. /**
  156. * 封装样例查询条件
  157. *
  158. * @param jobName 用户名
  159. * @return 封装好的样例查询条件
  160. */
  161. private Specification<Quartz> getDemoQuerySpecification(final String jobName, final String jobType) {
  162. return (Specification<Quartz>) (root, criteriaQuery, cb) -> {
  163. List<Predicate> predicates = new ArrayList<>();
  164. if (!jobName.isEmpty()) {
  165. predicates.add(cb.like(root.get("jobName").as(String.class), "%" + jobName + "%"));
  166. }
  167. if (!jobType.isEmpty()) {
  168. predicates.add(cb.like(root.get("jobType").as(String.class), "%" + jobType + "%"));
  169. }
  170. return cb.and(predicates.toArray(new Predicate[predicates.size()]));
  171. };
  172. }
  173. @Transactional(propagation = Propagation.REQUIRED)
  174. public boolean updateState(Quartz quartz) {
  175. boolean flag = false;
  176. try {
  177. Class c = Class.forName(quartz.getExecuteClass());
  178. c.newInstance();
  179. if (quartz.getCronExpression().indexOf(" ") != -1) {
  180. scheduleJob(c, quartz.getJobName(), quartz.getStartTime(), quartz.getCronExpression(), null);
  181. } else {
  182. scheduleJob(c, quartz.getJobName(), quartz.getStartTime(),
  183. Long.valueOf(Integer.parseInt(quartz.getCronExpression()) * 1000L), null);
  184. }
  185. if (quartz.getJobState().equals("暂停")) {
  186. pauseJob(quartz.getJobName());
  187. log.debug("定时任务暂停:" + quartz.getJobName());
  188. }
  189. if (!quartz.getJobState().equals("暂停")) {
  190. log.debug("定时任务正常:" + quartz.getJobName());
  191. quartz.setJobState(getJobStatus(quartz.getJobName()));
  192. }
  193. quartzRepository.save(quartz);
  194. flag = true;
  195. } catch (Exception e) {
  196. log.error("系统错误" + e);
  197. }
  198. return flag;
  199. }
  200. /**
  201. * 定时任务恢复初始化
  202. */
  203. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  204. public Boolean initJobClass() throws SQLException {
  205. Connection connection = null;
  206. try {
  207. String driverClassName = this.driverClassName;
  208. String url = this.url;
  209. String username = this.username;
  210. String password = this.password;
  211. Class.forName(driverClassName);
  212. connection = DriverManager.getConnection(url, username, password);
  213. ClassPathResource rc = new ClassPathResource("sql/jobload/E63_JOB.sql");
  214. EncodedResource er = new EncodedResource(rc, "utf-8");
  215. ScriptUtils.executeSqlScript(connection, er);
  216. return true;
  217. } catch (Exception e) {
  218. e.printStackTrace();
  219. return false;
  220. } finally {
  221. if (connection != null) {
  222. connection.close();
  223. }
  224. }
  225. }
  226. }