QuartzJobUtils.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.template.common.utils;
  2. import com.template.model.pojo.SmartDataSourceJobParams;
  3. import com.template.model.pojo.SmartDataTask;
  4. import org.quartz.*;
  5. import java.text.ParseException;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import java.util.Map;
  9. public class QuartzJobUtils {
  10. private static final String JobClass = "com.template.controller.Task";
  11. /**
  12. * 创建定时任务
  13. *
  14. * @param scheduler 调度器
  15. * @param smartDataTask 定时任务信息类
  16. */
  17. public static Map<String, Object> createScheduleJob(Scheduler scheduler,
  18. SmartDataTask smartDataTask) {
  19. // 判断是否存在该任务,存在则不创建任务,直接返回信息提示
  20. Map<String, Object> exists = exists(scheduler, smartDataTask.getTkName());
  21. if ("0".equals(exists.get("code"))) {
  22. return exists;
  23. }
  24. try {
  25. Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(JobClass);
  26. // 构建定时任务信息
  27. JobDetail jobDetail = JobBuilder.newJob(jobClass)
  28. .withIdentity(smartDataTask.getTkName())
  29. .build();
  30. // 创建一个JobDataMap对象,并设置参数
  31. JobDataMap jobDataMap = new JobDataMap();
  32. // 任务参数
  33. jobDataMap.put("smartDataTask", smartDataTask);
  34. // 将JobDataMap对象与JobDetail关联
  35. jobDetail.getJobDataMap().putAll(jobDataMap);
  36. // 设置定时任务的执行方式
  37. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(smartDataTask.getTkCron());
  38. // 构建触发器
  39. CronTrigger cronTrigger = TriggerBuilder.newTrigger()
  40. .withIdentity(smartDataTask.getTkName())
  41. .withSchedule(cronScheduleBuilder)
  42. .build();
  43. // 把触发器与任务进行绑定
  44. scheduler.scheduleJob(jobDetail, cronTrigger);
  45. return CommonUtil.getReturnMap(String.valueOf(0), "定时任务【" + smartDataTask.getTkName() + "】创建成功!");
  46. } catch (ClassNotFoundException e) {
  47. return CommonUtil.getReturnMap(String.valueOf(1), "找不到定时任务类!");
  48. } catch (SchedulerException e) {
  49. return CommonUtil.getReturnMap(String.valueOf(1), "创建定时任务出错:" + e.getMessage());
  50. }
  51. }
  52. public static String getNextExeTime(String cronExpression) {
  53. // 创建CronExpression对象
  54. CronExpression cron;
  55. try {
  56. cron = new CronExpression(cronExpression);
  57. } catch (ParseException e) {
  58. throw new RuntimeException(e);
  59. }
  60. // 获取当前时间
  61. long currentTimeMillis = System.currentTimeMillis();
  62. // 计算下次执行时间
  63. Date nextValidTimeMillis = cron.getNextValidTimeAfter(new Date(currentTimeMillis));
  64. // 格式化输出
  65. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  66. return sdf.format(nextValidTimeMillis);
  67. }
  68. /**
  69. * 根据任务暂停定时任务
  70. *
  71. * @param scheduler 调度器
  72. * @param jobName 任务名称
  73. */
  74. public static Map<String, Object> pauseScheduleJob(Scheduler scheduler, String jobName) {
  75. Map<String, Object> exists = exists(scheduler, jobName);
  76. if ("1".equals(exists.get("code"))) {
  77. return exists;
  78. }
  79. JobKey jobKey = JobKey.jobKey(jobName);
  80. try {
  81. scheduler.pauseJob(jobKey);
  82. return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】暂停成功!");
  83. } catch (SchedulerException e) {
  84. return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】暂停出错:" + e.getMessage());
  85. }
  86. }
  87. private static Map<String, Object> exists(Scheduler scheduler, String jobName) {
  88. JobKey jobKey = new JobKey(jobName);
  89. try {
  90. if (scheduler.getJobDetail(jobKey) != null) {
  91. return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】已在运行!");
  92. } else {
  93. return CommonUtil.getReturnMap("1", "定时任务【" + jobName + "】不存在!");
  94. }
  95. } catch (SchedulerException e) {
  96. return CommonUtil.getReturnMap("1", "异常:" + e.getMessage());
  97. }
  98. }
  99. /**
  100. * 根据任务恢复定时任务
  101. *
  102. * @param scheduler 调度器
  103. * @param jobName 任务名称
  104. */
  105. public static Map<String, Object> resumeScheduleJob(Scheduler scheduler, String jobName) {
  106. Map<String, Object> exists = exists(scheduler, jobName);
  107. if ("1".equals(exists.get("code"))) {
  108. return exists;
  109. }
  110. JobKey jobKey = JobKey.jobKey(jobName);
  111. try {
  112. scheduler.resumeJob(jobKey);
  113. return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】已恢复成功!");
  114. } catch (SchedulerException e) {
  115. return CommonUtil.getReturnMap("1", "定时任务【" + jobName + "】恢复出错:" + e.getMessage());
  116. }
  117. }
  118. /**
  119. * 根据任务名称立即运行一次定时任务
  120. *
  121. * @param scheduler 调度器
  122. * @param jobName 任务名称
  123. */
  124. public static Map<String, Object> runOnce(Scheduler scheduler, String jobName) {
  125. Map<String, Object> exists = exists(scheduler, jobName);
  126. if ("1".equals(exists.get("code"))) {
  127. return exists;
  128. }
  129. JobKey jobKey = JobKey.jobKey(jobName);
  130. try {
  131. scheduler.triggerJob(jobKey);
  132. return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】立即运行1次成功!");
  133. } catch (SchedulerException e) {
  134. return CommonUtil.getReturnMap("1", "定时任务【" + jobName + "】立即运行1次出错:" + e.getMessage());
  135. }
  136. }
  137. /**
  138. * 根据任务更新定时任务
  139. *
  140. * @param scheduler 调度器
  141. * @param smartDataTask 定时任务信息类
  142. */
  143. public static Map<String, Object> updateScheduleJob(Scheduler scheduler, SmartDataTask smartDataTask) {
  144. Map<String, Object> exists = exists(scheduler, smartDataTask.getTkName());
  145. if ("1".equals(exists.get("code"))) {
  146. return exists;
  147. }
  148. try {
  149. //获取到对应任务的触发器
  150. TriggerKey triggerKey = TriggerKey.triggerKey(smartDataTask.getTkName());
  151. //设置定时任务的执行方式
  152. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(smartDataTask.getTkCron());
  153. //重新构建任务的触发器
  154. CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  155. trigger = trigger.getTriggerBuilder()
  156. .withIdentity(triggerKey)
  157. .withSchedule(cronScheduleBuilder)
  158. .build();
  159. //重置对应的Job
  160. scheduler.rescheduleJob(triggerKey, trigger);
  161. return CommonUtil.getReturnMap("0", "定时任务【" + smartDataTask.getTkName() + "】刷新成功!");
  162. } catch (SchedulerException e) {
  163. return CommonUtil.getReturnMap("1", "定时任务【" + smartDataTask.getTkName() + "】刷新出错:" + e.getMessage());
  164. }
  165. }
  166. /**
  167. * 根据定时任务名称从调度器中除定时任务
  168. *
  169. * @param scheduler 调度器
  170. * @param jobName 任务名称
  171. */
  172. public static Map<String, Object> deleteScheduleJob(Scheduler scheduler, String jobName) {
  173. Map<String, Object> exists = exists(scheduler, jobName);
  174. if ("1".equals(exists.get("code"))) {
  175. return exists;
  176. }
  177. JobKey jobKey = JobKey.jobKey(jobName);
  178. try {
  179. scheduler.deleteJob(jobKey);
  180. return CommonUtil.getReturnMap(String.valueOf(0), "定时任务【" + jobName + "】删除成功!");
  181. } catch (SchedulerException e) {
  182. return CommonUtil.getReturnMap(String.valueOf(1), "定时任务【" + jobName + "】删除出错:" + e.getMessage());
  183. }
  184. }
  185. }