SysJobServiceImpl.java 7.2 KB

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