ff762c726bd93f00fda9a4fc031fa9823f3f9008.svn-base 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package org.jeecg.modules.quartz.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.jeecg.common.constant.CommonConstant;
  5. import org.jeecg.common.exception.JeecgBootException;
  6. import org.jeecg.common.util.DateUtils;
  7. import org.jeecg.modules.quartz.entity.QuartzJob;
  8. import org.jeecg.modules.quartz.mapper.QuartzJobMapper;
  9. import org.jeecg.modules.quartz.service.IQuartzJobService;
  10. import org.quartz.*;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import java.util.Date;
  15. import java.util.List;
  16. /**
  17. * @Description: 定时任务在线管理
  18. * @Author: jeecg-boot
  19. * @Date: 2019-04-28
  20. * @Version: V1.1
  21. */
  22. @Slf4j
  23. @Service
  24. public class QuartzJobServiceImpl extends ServiceImpl<QuartzJobMapper, QuartzJob> implements IQuartzJobService {
  25. @Autowired
  26. private QuartzJobMapper quartzJobMapper;
  27. @Autowired
  28. private Scheduler scheduler;
  29. /**
  30. * 立即执行的任务分组
  31. */
  32. private static final String JOB_TEST_GROUP = "test_group";
  33. @Override
  34. public List<QuartzJob> findByJobClassName(String jobClassName) {
  35. return quartzJobMapper.findByJobClassName(jobClassName);
  36. }
  37. /**
  38. * 保存&启动定时任务
  39. */
  40. @Override
  41. @Transactional(rollbackFor = JeecgBootException.class)
  42. public boolean saveAndScheduleJob(QuartzJob quartzJob) {
  43. // DB设置修改
  44. quartzJob.setDelFlag(CommonConstant.DEL_FLAG_0);
  45. boolean success = this.save(quartzJob);
  46. if (success) {
  47. if (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) {
  48. // 定时器添加
  49. this.schedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
  50. }
  51. }
  52. return success;
  53. }
  54. /**
  55. * 恢复定时任务
  56. */
  57. @Override
  58. @Transactional(rollbackFor = JeecgBootException.class)
  59. public boolean resumeJob(QuartzJob quartzJob) {
  60. schedulerDelete(quartzJob.getId());
  61. schedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
  62. quartzJob.setStatus(CommonConstant.STATUS_NORMAL);
  63. return this.updateById(quartzJob);
  64. }
  65. /**
  66. * 编辑&启停定时任务
  67. * @throws SchedulerException
  68. */
  69. @Override
  70. @Transactional(rollbackFor = JeecgBootException.class)
  71. public boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException {
  72. if (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) {
  73. schedulerDelete(quartzJob.getId());
  74. schedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
  75. }else{
  76. scheduler.pauseJob(JobKey.jobKey(quartzJob.getId()));
  77. }
  78. return this.updateById(quartzJob);
  79. }
  80. /**
  81. * 删除&停止删除定时任务
  82. */
  83. @Override
  84. @Transactional(rollbackFor = JeecgBootException.class)
  85. public boolean deleteAndStopJob(QuartzJob job) {
  86. schedulerDelete(job.getId());
  87. boolean ok = this.removeById(job.getId());
  88. return ok;
  89. }
  90. @Override
  91. public void execute(QuartzJob quartzJob) throws Exception {
  92. String jobName = quartzJob.getJobClassName().trim();
  93. Date startDate = new Date();
  94. String ymd = DateUtils.date2Str(startDate,DateUtils.yyyymmddhhmmss.get());
  95. String identity = jobName + ymd;
  96. //3秒后执行 只执行一次
  97. // update-begin--author:sunjianlei ---- date:20210511--- for:定时任务立即执行,延迟3秒改成0.1秒-------
  98. startDate.setTime(startDate.getTime() + 100L);
  99. // update-end--author:sunjianlei ---- date:20210511--- for:定时任务立即执行,延迟3秒改成0.1秒-------
  100. // 定义一个Trigger
  101. SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
  102. .withIdentity(identity, JOB_TEST_GROUP)
  103. .startAt(startDate)
  104. .build();
  105. // 构建job信息
  106. JobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(identity).usingJobData("parameter", quartzJob.getParameter()).build();
  107. // 将trigger和 jobDetail 加入这个调度
  108. scheduler.scheduleJob(jobDetail, trigger);
  109. // 启动scheduler
  110. scheduler.start();
  111. }
  112. @Override
  113. @Transactional(rollbackFor = JeecgBootException.class)
  114. public void pause(QuartzJob quartzJob){
  115. schedulerDelete(quartzJob.getId());
  116. quartzJob.setStatus(CommonConstant.STATUS_DISABLE);
  117. this.updateById(quartzJob);
  118. }
  119. /**
  120. * 添加定时任务
  121. *
  122. * @param jobClassName
  123. * @param cronExpression
  124. * @param parameter
  125. */
  126. private void schedulerAdd(String id, String jobClassName, String cronExpression, String parameter) {
  127. try {
  128. // 启动调度器
  129. scheduler.start();
  130. // 构建job信息
  131. JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(id).usingJobData("parameter", parameter).build();
  132. // 表达式调度构建器(即任务执行的时间)
  133. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
  134. // 按新的cronExpression表达式构建一个新的trigger
  135. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(id).withSchedule(scheduleBuilder).build();
  136. scheduler.scheduleJob(jobDetail, trigger);
  137. } catch (SchedulerException e) {
  138. throw new JeecgBootException("创建定时任务失败", e);
  139. } catch (RuntimeException e) {
  140. throw new JeecgBootException(e.getMessage(), e);
  141. }catch (Exception e) {
  142. throw new JeecgBootException("后台找不到该类名:" + jobClassName, e);
  143. }
  144. }
  145. /**
  146. * 删除定时任务
  147. *
  148. * @param id
  149. */
  150. private void schedulerDelete(String id) {
  151. try {
  152. scheduler.pauseTrigger(TriggerKey.triggerKey(id));
  153. scheduler.unscheduleJob(TriggerKey.triggerKey(id));
  154. scheduler.deleteJob(JobKey.jobKey(id));
  155. } catch (Exception e) {
  156. log.error(e.getMessage(), e);
  157. throw new JeecgBootException("删除定时任务失败");
  158. }
  159. }
  160. private static Job getClass(String classname) throws Exception {
  161. Class<?> class1 = Class.forName(classname);
  162. return (Job) class1.newInstance();
  163. }
  164. }