ScheduleUtils.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package com.kmall.schedule.utils;
  2. import com.kmall.common.utils.RRException;
  3. import com.kmall.schedule.entity.ScheduleJobEntity;
  4. import com.kmall.common.utils.Constant.ScheduleStatus;
  5. import org.quartz.*;
  6. /**
  7. * 定时任务工具类
  8. *
  9. * @author Scott
  10. * @email
  11. * @date 2016年11月30日 下午12:44:59
  12. */
  13. public class ScheduleUtils {
  14. private final static String JOB_NAME = "TASK_";
  15. /**
  16. * 获取触发器key
  17. */
  18. public static TriggerKey getTriggerKey(Long jobId) {
  19. return TriggerKey.triggerKey(JOB_NAME + jobId);
  20. }
  21. /**
  22. * 获取jobKey
  23. */
  24. public static JobKey getJobKey(Long jobId) {
  25. return JobKey.jobKey(JOB_NAME + jobId);
  26. }
  27. /**
  28. * 获取表达式触发器
  29. */
  30. public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
  31. try {
  32. return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
  33. } catch (SchedulerException e) {
  34. throw new RRException("获取定时任务CronTrigger出现异常", e);
  35. }
  36. }
  37. /**
  38. * 创建定时任务
  39. */
  40. public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  41. try {
  42. //构建job信息
  43. JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
  44. //表达式调度构建器
  45. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
  46. .withMisfireHandlingInstructionDoNothing();
  47. //按新的cronExpression表达式构建一个新的trigger
  48. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
  49. //放入参数,运行时的方法可以获取
  50. jobDetail.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  51. scheduler.scheduleJob(jobDetail, trigger);
  52. //暂停任务
  53. if (scheduleJob.getStatus() == ScheduleStatus.PAUSE.getValue()) {
  54. pauseJob(scheduler, scheduleJob.getJobId());
  55. }
  56. } catch (SchedulerException e) {
  57. throw new RRException("创建定时任务失败", e);
  58. }
  59. }
  60. /**
  61. * 更新定时任务
  62. */
  63. public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  64. try {
  65. TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
  66. //表达式调度构建器
  67. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
  68. .withMisfireHandlingInstructionDoNothing();
  69. CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
  70. //按新的cronExpression表达式重新构建trigger
  71. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
  72. //参数
  73. trigger.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  74. scheduler.rescheduleJob(triggerKey, trigger);
  75. //暂停任务
  76. if (scheduleJob.getStatus() == ScheduleStatus.PAUSE.getValue()) {
  77. pauseJob(scheduler, scheduleJob.getJobId());
  78. }
  79. } catch (SchedulerException e) {
  80. throw new RRException("更新定时任务失败", e);
  81. }
  82. }
  83. /**
  84. * 立即执行任务
  85. */
  86. public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  87. try {
  88. //参数
  89. JobDataMap dataMap = new JobDataMap();
  90. dataMap.put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  91. scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
  92. } catch (SchedulerException e) {
  93. throw new RRException("立即执行定时任务失败", e);
  94. }
  95. }
  96. /**
  97. * 暂停任务
  98. */
  99. public static void pauseJob(Scheduler scheduler, Long jobId) {
  100. try {
  101. scheduler.pauseJob(getJobKey(jobId));
  102. } catch (SchedulerException e) {
  103. throw new RRException("暂停定时任务失败", e);
  104. }
  105. }
  106. /**
  107. * 恢复任务
  108. */
  109. public static void resumeJob(Scheduler scheduler, Long jobId) {
  110. try {
  111. scheduler.resumeJob(getJobKey(jobId));
  112. } catch (SchedulerException e) {
  113. throw new RRException("暂停定时任务失败", e);
  114. }
  115. }
  116. /**
  117. * 删除定时任务
  118. */
  119. public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
  120. try {
  121. scheduler.deleteJob(getJobKey(jobId));
  122. } catch (SchedulerException e) {
  123. throw new RRException("删除定时任务失败", e);
  124. }
  125. }
  126. }