SysJobServiceImpl.java 7.0 KB

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