SysJobServiceImpl.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package com.ruoyi.quartz.service.impl;
  2. import java.util.List;
  3. import javax.annotation.PostConstruct;
  4. import org.quartz.JobDataMap;
  5. import org.quartz.JobKey;
  6. import org.quartz.Scheduler;
  7. import org.quartz.SchedulerException;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.transaction.annotation.Transactional;
  11. import com.ruoyi.common.constant.ScheduleConstants;
  12. import com.ruoyi.common.exception.job.TaskException;
  13. import com.ruoyi.quartz.domain.SysJob;
  14. import com.ruoyi.quartz.mapper.SysJobMapper;
  15. import com.ruoyi.quartz.service.ISysJobService;
  16. import com.ruoyi.quartz.util.CronUtils;
  17. import com.ruoyi.quartz.util.ScheduleUtils;
  18. /**
  19. * 定时任务调度信息 服务层
  20. *
  21. * @author ruoyi
  22. */
  23. @Service
  24. public class SysJobServiceImpl implements ISysJobService
  25. {
  26. @Autowired
  27. private Scheduler scheduler;
  28. @Autowired
  29. private SysJobMapper jobMapper;
  30. /**
  31. * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
  32. */
  33. @PostConstruct
  34. public void init() throws SchedulerException, TaskException
  35. {
  36. scheduler.clear();
  37. List<SysJob> jobList = jobMapper.selectJobAll();
  38. for (SysJob job : jobList)
  39. {
  40. ScheduleUtils.createScheduleJob(scheduler, job);
  41. }
  42. }
  43. /**
  44. * 获取quartz调度器的计划任务列表
  45. *
  46. * @param job 调度信息
  47. * @return
  48. */
  49. @Override
  50. public List<SysJob> selectJobList(SysJob job)
  51. {
  52. return jobMapper.selectJobList(job);
  53. }
  54. /**
  55. * 通过调度任务ID查询调度信息
  56. *
  57. * @param jobId 调度任务ID
  58. * @return 调度任务对象信息
  59. */
  60. @Override
  61. public SysJob selectJobById(Long jobId)
  62. {
  63. return jobMapper.selectJobById(jobId);
  64. }
  65. /**
  66. * 暂停任务
  67. *
  68. * @param job 调度信息
  69. */
  70. @Override
  71. @Transactional(rollbackFor = Exception.class)
  72. public int pauseJob(SysJob job) throws SchedulerException
  73. {
  74. Long jobId = job.getJobId();
  75. String jobGroup = job.getJobGroup();
  76. job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
  77. int rows = jobMapper.updateJob(job);
  78. if (rows > 0)
  79. {
  80. scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
  81. }
  82. return rows;
  83. }
  84. /**
  85. * 恢复任务
  86. *
  87. * @param job 调度信息
  88. */
  89. @Override
  90. @Transactional(rollbackFor = Exception.class)
  91. public int resumeJob(SysJob job) throws SchedulerException
  92. {
  93. Long jobId = job.getJobId();
  94. String jobGroup = job.getJobGroup();
  95. job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
  96. int rows = jobMapper.updateJob(job);
  97. if (rows > 0)
  98. {
  99. scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
  100. }
  101. return rows;
  102. }
  103. /**
  104. * 删除任务后,所对应的trigger也将被删除
  105. *
  106. * @param job 调度信息
  107. */
  108. @Override
  109. @Transactional(rollbackFor = Exception.class)
  110. public int deleteJob(SysJob job) throws SchedulerException
  111. {
  112. Long jobId = job.getJobId();
  113. String jobGroup = job.getJobGroup();
  114. int rows = jobMapper.deleteJobById(jobId);
  115. if (rows > 0)
  116. {
  117. scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
  118. }
  119. return rows;
  120. }
  121. /**
  122. * 批量删除调度信息
  123. *
  124. * @param jobIds 需要删除的任务ID
  125. * @return 结果
  126. */
  127. @Override
  128. @Transactional(rollbackFor = Exception.class)
  129. public void deleteJobByIds(Long[] jobIds) throws SchedulerException
  130. {
  131. for (Long jobId : jobIds)
  132. {
  133. SysJob job = jobMapper.selectJobById(jobId);
  134. deleteJob(job);
  135. }
  136. }
  137. /**
  138. * 任务调度状态修改
  139. *
  140. * @param job 调度信息
  141. */
  142. @Override
  143. @Transactional(rollbackFor = Exception.class)
  144. public int changeStatus(SysJob job) throws SchedulerException
  145. {
  146. int rows = 0;
  147. String status = job.getStatus();
  148. if (ScheduleConstants.Status.NORMAL.getValue().equals(status))
  149. {
  150. rows = resumeJob(job);
  151. }
  152. else if (ScheduleConstants.Status.PAUSE.getValue().equals(status))
  153. {
  154. rows = pauseJob(job);
  155. }
  156. return rows;
  157. }
  158. /**
  159. * 立即运行任务
  160. *
  161. * @param job 调度信息
  162. */
  163. @Override
  164. @Transactional(rollbackFor = Exception.class)
  165. public void run(SysJob job) throws SchedulerException
  166. {
  167. Long jobId = job.getJobId();
  168. String jobGroup = job.getJobGroup();
  169. SysJob properties = selectJobById(job.getJobId());
  170. // 参数
  171. JobDataMap dataMap = new JobDataMap();
  172. dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties);
  173. scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap);
  174. }
  175. /**
  176. * 新增任务
  177. *
  178. * @param job 调度信息 调度信息
  179. */
  180. @Override
  181. @Transactional(rollbackFor = Exception.class)
  182. public int insertJob(SysJob job) throws SchedulerException, TaskException
  183. {
  184. job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
  185. int rows = jobMapper.insertJob(job);
  186. if (rows > 0)
  187. {
  188. ScheduleUtils.createScheduleJob(scheduler, job);
  189. }
  190. return rows;
  191. }
  192. /**
  193. * 更新任务的时间表达式
  194. *
  195. * @param job 调度信息
  196. */
  197. @Override
  198. @Transactional(rollbackFor = Exception.class)
  199. public int updateJob(SysJob job) throws SchedulerException, TaskException
  200. {
  201. SysJob properties = selectJobById(job.getJobId());
  202. int rows = jobMapper.updateJob(job);
  203. if (rows > 0)
  204. {
  205. updateSchedulerJob(job, properties.getJobGroup());
  206. }
  207. return rows;
  208. }
  209. /**
  210. * 更新任务
  211. *
  212. * @param job 任务对象
  213. * @param jobGroup 任务组名
  214. */
  215. public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException
  216. {
  217. Long jobId = job.getJobId();
  218. // 判断是否存在
  219. JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
  220. if (scheduler.checkExists(jobKey))
  221. {
  222. // 防止创建时存在数据问题 先移除,然后在执行创建操作
  223. scheduler.deleteJob(jobKey);
  224. }
  225. ScheduleUtils.createScheduleJob(scheduler, job);
  226. }
  227. /**
  228. * 校验cron表达式是否有效
  229. *
  230. * @param cronExpression 表达式
  231. * @return 结果
  232. */
  233. @Override
  234. public boolean checkCronExpressionIsValid(String cronExpression)
  235. {
  236. return CronUtils.isValid(cronExpression);
  237. }
  238. }