ScheduleUtils.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /**
  2. * Copyright 2018 人人开源 http://www.renren.io
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. * <p>
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package io.renren.modules.job.utils;
  17. import io.renren.common.exception.RRException;
  18. import io.renren.common.utils.Constant;
  19. import io.renren.modules.job.entity.ScheduleJobEntity;
  20. import org.quartz.*;
  21. /**
  22. * 定时任务工具类
  23. *
  24. * @author Mark sunlightcs@gmail.com
  25. * @since 1.2.0 2016-11-28
  26. */
  27. public class ScheduleUtils {
  28. private final static String JOB_NAME = "TASK_";
  29. /**
  30. * 获取触发器key
  31. */
  32. public static TriggerKey getTriggerKey(Long jobId) {
  33. return TriggerKey.triggerKey(JOB_NAME + jobId);
  34. }
  35. /**
  36. * 获取jobKey
  37. */
  38. public static JobKey getJobKey(Long jobId) {
  39. return JobKey.jobKey(JOB_NAME + jobId);
  40. }
  41. /**
  42. * 获取表达式触发器
  43. */
  44. public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
  45. try {
  46. return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
  47. } catch (SchedulerException e) {
  48. throw new RRException("获取定时任务CronTrigger出现异常", e);
  49. }
  50. }
  51. /**
  52. * 创建定时任务
  53. */
  54. public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  55. try {
  56. //构建job信息
  57. JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
  58. //表达式调度构建器
  59. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
  60. .withMisfireHandlingInstructionDoNothing();
  61. //按新的cronExpression表达式构建一个新的trigger
  62. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
  63. //放入参数,运行时的方法可以获取
  64. jobDetail.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  65. scheduler.scheduleJob(jobDetail, trigger);
  66. //暂停任务
  67. if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
  68. pauseJob(scheduler, scheduleJob.getJobId());
  69. }
  70. } catch (SchedulerException e) {
  71. throw new RRException("创建定时任务失败", e);
  72. }
  73. }
  74. /**
  75. * 更新定时任务
  76. */
  77. public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  78. try {
  79. TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
  80. //表达式调度构建器
  81. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
  82. .withMisfireHandlingInstructionDoNothing();
  83. CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
  84. //按新的cronExpression表达式重新构建trigger
  85. trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
  86. //参数
  87. trigger.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  88. scheduler.rescheduleJob(triggerKey, trigger);
  89. //暂停任务
  90. if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
  91. pauseJob(scheduler, scheduleJob.getJobId());
  92. }
  93. } catch (SchedulerException e) {
  94. throw new RRException("更新定时任务失败", e);
  95. }
  96. }
  97. /**
  98. * 立即执行任务
  99. */
  100. public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
  101. try {
  102. //参数
  103. JobDataMap dataMap = new JobDataMap();
  104. dataMap.put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
  105. scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
  106. } catch (SchedulerException e) {
  107. throw new RRException("立即执行定时任务失败", e);
  108. }
  109. }
  110. /**
  111. * 暂停任务
  112. */
  113. public static void pauseJob(Scheduler scheduler, Long jobId) {
  114. try {
  115. scheduler.pauseJob(getJobKey(jobId));
  116. } catch (SchedulerException e) {
  117. throw new RRException("暂停定时任务失败", e);
  118. }
  119. }
  120. /**
  121. * 恢复任务
  122. */
  123. public static void resumeJob(Scheduler scheduler, Long jobId) {
  124. try {
  125. scheduler.resumeJob(getJobKey(jobId));
  126. } catch (SchedulerException e) {
  127. throw new RRException("暂停定时任务失败", e);
  128. }
  129. }
  130. /**
  131. * 删除定时任务
  132. */
  133. public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
  134. try {
  135. scheduler.deleteJob(getJobKey(jobId));
  136. } catch (SchedulerException e) {
  137. throw new RRException("删除定时任务失败", e);
  138. }
  139. }
  140. }