212aaec23ef5354c429f51fc1d504f6dac643297.svn-base 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package cn.com.goldenwater.dcproj.task;
  2. import cn.com.goldenwater.dcproj.model.BisInspTaskScheduler;
  3. import cn.com.goldenwater.dcproj.param.BisInspTaskSchedulerParam;
  4. import cn.com.goldenwater.dcproj.service.BisInspTaskSchedulerService;
  5. import cn.com.goldenwater.dcproj.utils.TaskUtils;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.quartz.*;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Component;
  12. import javax.annotation.PostConstruct;
  13. import java.util.List;
  14. import static org.quartz.CronExpression.isValidExpression;
  15. /**
  16. * @author lhc
  17. * @date 2020/10/12 9:10
  18. */
  19. @Component
  20. public class TaskInitService {
  21. private Logger log = LoggerFactory.getLogger(getClass());
  22. @Autowired
  23. private BisInspTaskSchedulerService bisInspTaskSchedulerService;
  24. @Autowired
  25. private Scheduler scheduler;
  26. private final static String TASK_STATUS = "1";
  27. /**
  28. * 初始化
  29. */
  30. @PostConstruct
  31. public void init() {
  32. if (scheduler == null) {
  33. log.error("初始化定时任务组件失败,Scheduler is null...");
  34. return;
  35. }
  36. // 初始化基于cron时间配置的任务列表
  37. try {
  38. // initCronJobs(scheduler);
  39. } catch (Exception e) {
  40. log.error("init cron tasks error," + e.getMessage(), e);
  41. }
  42. try {
  43. // log.info("The scheduler is starting...");
  44. // scheduler.start(); // start the scheduler
  45. } catch (Exception e) {
  46. log.error("The scheduler start is error," + e.getMessage(), e);
  47. }
  48. }
  49. /**
  50. * 初始化任务(基于cron触发器)
  51. */
  52. private void initCronJobs(Scheduler scheduler) throws Exception {
  53. BisInspTaskSchedulerParam bisInspTaskSchedulerParam = new BisInspTaskSchedulerParam();
  54. bisInspTaskSchedulerParam.setTaskStatus(TASK_STATUS);
  55. Iterable<BisInspTaskScheduler> jobList = bisInspTaskSchedulerService.findList(bisInspTaskSchedulerParam);
  56. if (jobList != null) {
  57. for (BisInspTaskScheduler job : jobList) {
  58. scheduleCronJob(job, scheduler);
  59. }
  60. }
  61. }
  62. /**
  63. * 安排任务(基于cron触发器)
  64. *
  65. * @param job
  66. * @param scheduler
  67. */
  68. private void scheduleCronJob(BisInspTaskScheduler job, Scheduler scheduler) {
  69. if (job != null && StringUtils.isNotBlank(job.getTaskName()) && StringUtils.isNotBlank(job.getTaskClass())
  70. && StringUtils.isNotBlank(job.getTaskSchedule()) && scheduler != null) {
  71. try {
  72. JobKey jobKey = TaskUtils.genCronJobKey(job);
  73. // 判断 key是否存在 已存在更新 job, 不存在新建 job
  74. if (!scheduler.checkExists(jobKey)) {
  75. // 创建新 job
  76. log.info("Add new cron job to scheduler, jobName = " + job.getTaskName());
  77. this.newJobAndNewCronTrigger(job, scheduler, jobKey);
  78. } else {
  79. // 更新 job
  80. log.info("Update cron job to scheduler, jobName = " + job.getTaskName());
  81. this.updateCronTriggerOfJob(job, scheduler, jobKey);
  82. }
  83. } catch (Exception e) {
  84. log.error("ScheduleCronJob is error," + e.getMessage(), e);
  85. }
  86. } else {
  87. log.error("Method scheduleCronJob arguments are invalid.");
  88. }
  89. }
  90. /**
  91. * 新建job和trigger到scheduler(基于cron触发器)
  92. *
  93. * @param job
  94. * @param scheduler
  95. * @param jobKey
  96. * @throws SchedulerException
  97. * @throws ClassNotFoundException
  98. */
  99. @SuppressWarnings({"rawtypes", "unchecked"})
  100. private void newJobAndNewCronTrigger(BisInspTaskScheduler job, Scheduler scheduler, JobKey jobKey)
  101. throws SchedulerException, ClassNotFoundException {
  102. TriggerKey triggerKey = TaskUtils.genCronTriggerKey(job);
  103. String cronExpr = job.getTaskSchedule();
  104. if (!isValidExpression(cronExpr)) {
  105. return;
  106. }
  107. // get a Class object by string class name of job;
  108. Class jobClass = Class.forName(job.getTaskClass().trim());
  109. JobDetail jobDetail = JobBuilder.newJob(jobClass)
  110. .withIdentity(jobKey)
  111. .withDescription(job.getTaskDesc())
  112. .usingJobData("param", job.getTaskParams())
  113. .build();
  114. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).forJob(jobKey)
  115. .withSchedule(CronScheduleBuilder.cronSchedule(cronExpr).withMisfireHandlingInstructionFireAndProceed())
  116. .build();
  117. scheduler.scheduleJob(jobDetail, trigger);
  118. }
  119. /**
  120. * 更新job的trigger(基于cron触发器)
  121. *
  122. * @param job
  123. * @param scheduler
  124. * @param jobKey
  125. * @throws SchedulerException
  126. */
  127. private void updateCronTriggerOfJob(BisInspTaskScheduler job, Scheduler scheduler, JobKey jobKey) throws SchedulerException {
  128. TriggerKey triggerKey = TaskUtils.genCronTriggerKey(job);
  129. String cronExpr = job.getTaskSchedule().trim();
  130. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  131. for (int i = 0; triggers != null && i < triggers.size(); i++) {
  132. Trigger trigger = triggers.get(i);
  133. TriggerKey curTriggerKey = trigger.getKey();
  134. if (TaskUtils.isTriggerKeyEqual(triggerKey, curTriggerKey)) {
  135. if (trigger instanceof CronTrigger
  136. && cronExpr.equalsIgnoreCase(((CronTrigger) trigger).getCronExpression())) {
  137. // Don't need to do anything.
  138. } else {
  139. if (isValidExpression(job.getTaskSchedule())) {
  140. // Cron expression is valid, build a new trigger and
  141. // replace the old one.
  142. CronTrigger newTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).forJob(jobKey)
  143. .withSchedule(CronScheduleBuilder.cronSchedule(cronExpr)
  144. .withMisfireHandlingInstructionDoNothing())
  145. .build();
  146. scheduler.rescheduleJob(curTriggerKey, newTrigger);
  147. }
  148. }
  149. } else {
  150. // different trigger key ,The trigger key is illegal, unschedule
  151. // this trigger
  152. scheduler.unscheduleJob(curTriggerKey);
  153. }
  154. }
  155. }
  156. }