QuartzUtils.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.simuwang.base.common.util;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.simuwang.base.pojo.dto.QuartzBean;
  4. import org.quartz.*;
  5. import org.quartz.impl.matchers.GroupMatcher;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.util.ObjectUtils;
  9. import java.util.*;
  10. /**
  11. * FileName: QuartzUtils
  12. * Author: chenjianhua
  13. * Date: 2024/9/17 10:25
  14. * Description: ${DESCRIPTION}
  15. */
  16. public class QuartzUtils {
  17. private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);
  18. /**
  19. * 获取所有的定时任务
  20. *
  21. * @throws Exception
  22. */
  23. public static List<QuartzBean> getAllJob(Scheduler scheduler) {
  24. GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
  25. List<QuartzBean> jobList = new ArrayList();
  26. try {
  27. Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
  28. for (JobKey jobKey : jobKeys) {
  29. List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
  30. for (Trigger trigger : triggers) {
  31. QuartzBean job = new QuartzBean();
  32. job.setJobName(jobKey.getName());
  33. job.setGroupName(jobKey.getGroup());
  34. Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
  35. job.setStatus(Trigger.TriggerState.NORMAL.equals(triggerState) ? 1 : 0);
  36. if (trigger instanceof CronTrigger) {
  37. CronTrigger cronTrigger = (CronTrigger) trigger;
  38. String cronExpression = cronTrigger.getCronExpression();
  39. job.setCronExpression(cronExpression);
  40. }
  41. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
  42. JobDataMap jobDataMap = jobDetail.getJobDataMap();
  43. String[] keys = jobDataMap.getKeys();
  44. if (keys != null && keys.length > 0) {
  45. Map<String, String> paramMap = new HashMap<>(keys.length, 1.0f);
  46. for (String key : keys) {
  47. paramMap.put(key, jobDataMap.get(key).toString());
  48. }
  49. String paramStr = JSON.toJSONString(paramMap);
  50. job.setJobParam(paramStr);
  51. }
  52. Class<? extends Job> jobClass = jobDetail.getJobClass();
  53. job.setJobClass(jobClass.getName());
  54. jobList.add(job);
  55. }
  56. }
  57. } catch (SchedulerException e) {
  58. logger.error(e.getMessage(),e);
  59. }
  60. return jobList;
  61. }
  62. /**
  63. * 创建定时任务 定时任务创建之后默认启动状态
  64. *
  65. * @param scheduler 调度器
  66. * @param quartzBean 定时任务信息类
  67. * @throws Exception
  68. */
  69. public static void createScheduleJob(Scheduler scheduler, QuartzBean quartzBean) {
  70. try {
  71. //获取到定时任务的执行类 必须是类的绝对路径名称
  72. //定时任务类需要是job类的具体实现 QuartzJobBean是job的抽象类。
  73. Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass());
  74. // 构建定时任务信息
  75. JobBuilder jobBuilder = JobBuilder.newJob(jobClass).withIdentity(quartzBean.getJobName(), quartzBean.getGroupName());
  76. // 设置参数
  77. Map<String, String> paramHashMap = JSON.parseObject(quartzBean.getJobParam(), HashMap.class);
  78. if (!ObjectUtils.isEmpty(paramHashMap)) {
  79. paramHashMap.forEach(
  80. (param, paramValue) -> {
  81. jobBuilder.usingJobData(param, paramValue);
  82. }
  83. );
  84. }
  85. JobDetail jobDetail = jobBuilder
  86. .storeDurably()
  87. .build();
  88. // 设置定时任务执行方式
  89. CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCronExpression());
  90. // 构建触发器trigger
  91. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(quartzBean.getJobName()).withSchedule(scheduleBuilder).build();
  92. scheduler.scheduleJob(jobDetail, trigger);
  93. } catch (ClassNotFoundException e) {
  94. logger.error(e.getMessage(),e);
  95. } catch (SchedulerException e) {
  96. logger.error(e.getMessage(),e);
  97. }
  98. }
  99. /**
  100. * 根据任务名称暂停定时任务
  101. *
  102. * @param scheduler 调度器
  103. * @param jobKeyName 定时任务名称
  104. * @throws SchedulerException
  105. */
  106. public static void pauseScheduleJob(Scheduler scheduler, String jobKeyName,String groupName) {
  107. JobKey jobKey = JobKey.jobKey(jobKeyName, groupName);
  108. try {
  109. scheduler.pauseJob(jobKey);
  110. } catch (SchedulerException e) {
  111. logger.error("暂停定时任务出错:" +e.getMessage(),e);
  112. }
  113. }
  114. /**
  115. * 根据任务名称恢复定时任务
  116. *
  117. * @param scheduler 调度器
  118. * @param jobKeyName 定时任务名称
  119. * @throws SchedulerException
  120. */
  121. public static void resumeScheduleJob(Scheduler scheduler, String jobKeyName,String groupName) {
  122. JobKey jobKey = JobKey.jobKey(jobKeyName, groupName);
  123. try {
  124. scheduler.resumeJob(jobKey);
  125. } catch (SchedulerException e) {
  126. logger.error("启动定时任务出错:" +e.getMessage(),e);
  127. }
  128. }
  129. /**
  130. * 根据任务名称立即运行一次定时任务
  131. *
  132. * @param scheduler 调度器
  133. * @param jobKeyName 定时任务名称
  134. * @throws SchedulerException
  135. */
  136. public static void runOnce(Scheduler scheduler, String jobKeyName,String groupName) {
  137. JobKey jobKey = JobKey.jobKey(jobKeyName, groupName);
  138. try {
  139. scheduler.triggerJob(jobKey);
  140. } catch (SchedulerException e) {
  141. logger.error("运行定时任务出错:" +e.getMessage(),e);
  142. }
  143. }
  144. /**
  145. * 更新定时任务
  146. *
  147. * @param scheduler 调度器
  148. * @param quartzBean 定时任务信息类
  149. * @throws SchedulerException
  150. */
  151. public static void updateScheduleJob(Scheduler scheduler, QuartzBean quartzBean) {
  152. deleteScheduleJob(scheduler, quartzBean.getJobName(),quartzBean.getGroupName());
  153. createScheduleJob(scheduler, quartzBean);
  154. }
  155. /**
  156. * 根据定时任务名称从调度器当中删除定时任务
  157. *
  158. * @param scheduler 调度器
  159. * @param jobKeyName 定时任务名称
  160. * @throws SchedulerException
  161. */
  162. public static void deleteScheduleJob(Scheduler scheduler, String jobKeyName,String groupName) {
  163. JobKey jobKey = JobKey.jobKey(jobKeyName, groupName);
  164. try {
  165. if (ObjectUtils.isEmpty(jobKey)) {
  166. return;
  167. }
  168. scheduler.deleteJob(jobKey);
  169. } catch (SchedulerException e) {
  170. logger.error("删除定时任务出错:" +e.getMessage(),e);
  171. }
  172. }
  173. }