|
@@ -0,0 +1,151 @@
|
|
|
+package com.xxl.quartz;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+import org.quartz.CronScheduleBuilder;
|
|
|
+import org.quartz.CronTrigger;
|
|
|
+import org.quartz.Job;
|
|
|
+import org.quartz.JobBuilder;
|
|
|
+import org.quartz.JobDataMap;
|
|
|
+import org.quartz.JobDetail;
|
|
|
+import org.quartz.JobKey;
|
|
|
+import org.quartz.Scheduler;
|
|
|
+import org.quartz.SchedulerException;
|
|
|
+import org.quartz.Trigger;
|
|
|
+import org.quartz.TriggerBuilder;
|
|
|
+import org.quartz.TriggerKey;
|
|
|
+import org.quartz.impl.matchers.GroupMatcher;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.InitializingBean;
|
|
|
+import org.springframework.util.Assert;
|
|
|
+
|
|
|
+public final class DynamicSchedulerUtil implements InitializingBean {
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(DynamicSchedulerUtil.class);
|
|
|
+
|
|
|
+ // Scheduler
|
|
|
+ private static Scheduler scheduler;
|
|
|
+ public static void setScheduler(Scheduler scheduler) {
|
|
|
+ DynamicSchedulerUtil.scheduler = scheduler;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void afterPropertiesSet() throws Exception {
|
|
|
+ Assert.notNull(scheduler, "quartz scheduler is null");
|
|
|
+ logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler);
|
|
|
+ }
|
|
|
+
|
|
|
+ // getJobKeys
|
|
|
+ public static Set<JobKey> getJobKeys(){
|
|
|
+ try {
|
|
|
+ String groupName = scheduler.getJobGroupNames().get(0);
|
|
|
+ return scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // addJob 新增
|
|
|
+ public static boolean addJob(String triggerKeyName, String cronExpression, Class<? extends Job> jobClass, Map<String, Object> jobData) throws SchedulerException {
|
|
|
+ // TriggerKey : name + group
|
|
|
+ String group = Scheduler.DEFAULT_GROUP;
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
|
|
|
+
|
|
|
+ // TriggerKey valid if_exists
|
|
|
+ if (scheduler.checkExists(triggerKey)) {
|
|
|
+ Trigger trigger = scheduler.getTrigger(triggerKey);
|
|
|
+ logger.info(">>>>>>>>> Already exist trigger [" + trigger + "] by key [" + triggerKey + "] in Scheduler");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // CronTrigger : TriggerKey + cronExpression
|
|
|
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
|
|
|
+ CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
|
|
|
+
|
|
|
+ // JobDetail : jobClass
|
|
|
+ JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(triggerKeyName, group).build();
|
|
|
+ if (jobData!=null && jobData.size() > 0) {
|
|
|
+ JobDataMap jobDataMap = jobDetail.getJobDataMap();
|
|
|
+ jobDataMap.putAll(jobData); // JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
|
|
|
+ }
|
|
|
+
|
|
|
+ // schedule : jobDetail + cronTrigger
|
|
|
+ Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
|
|
|
+
|
|
|
+ logger.info(">>>>>>>>>>> addJob success, jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // unscheduleJob 删除
|
|
|
+ public static boolean removeJob(String triggerKeyName) throws SchedulerException {
|
|
|
+ // TriggerKey : name + group
|
|
|
+ String group = Scheduler.DEFAULT_GROUP;
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
|
|
|
+
|
|
|
+ boolean result = false;
|
|
|
+ if (scheduler.checkExists(triggerKey)) {
|
|
|
+ result = scheduler.unscheduleJob(triggerKey);
|
|
|
+ }
|
|
|
+ logger.info(">>>>>>>>>>> removeJob, triggerKey:{}, result [{}]", triggerKey, result);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // reschedule 重置cron
|
|
|
+ public static boolean rescheduleJob(String triggerKeyName, String cronExpression) throws SchedulerException {
|
|
|
+ // TriggerKey : name + group
|
|
|
+ String group = Scheduler.DEFAULT_GROUP;
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
|
|
|
+
|
|
|
+ boolean result = false;
|
|
|
+ if (scheduler.checkExists(triggerKey)) {
|
|
|
+ // CronTrigger : TriggerKey + cronExpression
|
|
|
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
|
|
|
+ CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
|
|
|
+
|
|
|
+ Date date = scheduler.rescheduleJob(triggerKey, cronTrigger);
|
|
|
+ result = true;
|
|
|
+ logger.info(">>>>>>>>>>> resumeJob success, triggerKey:{}, cronExpression:{}, date:{}", triggerKey, cronExpression, date);
|
|
|
+ } else {
|
|
|
+ logger.info(">>>>>>>>>>> resumeJob fail, triggerKey:{}, cronExpression:{}", triggerKey, cronExpression);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Pause 暂停
|
|
|
+ public static boolean pauseJob(String triggerKeyName) throws SchedulerException {
|
|
|
+ // TriggerKey : name + group
|
|
|
+ String group = Scheduler.DEFAULT_GROUP;
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
|
|
|
+
|
|
|
+ boolean result = false;
|
|
|
+ if (scheduler.checkExists(triggerKey)) {
|
|
|
+ scheduler.pauseTrigger(triggerKey);
|
|
|
+ result = true;
|
|
|
+ logger.info(">>>>>>>>>>> pauseJob success, triggerKey:{}", triggerKey);
|
|
|
+ } else {
|
|
|
+ logger.info(">>>>>>>>>>> pauseJob fail, triggerKey:{}", triggerKey);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // resume 重启
|
|
|
+ public static boolean resumeTrigger(String triggerKeyName) throws SchedulerException {
|
|
|
+ // TriggerKey : name + group
|
|
|
+ String group = Scheduler.DEFAULT_GROUP;
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
|
|
|
+
|
|
|
+ boolean result = false;
|
|
|
+ if (scheduler.checkExists(triggerKey)) {
|
|
|
+ scheduler.resumeTrigger(triggerKey);
|
|
|
+ result = true;
|
|
|
+ logger.info(">>>>>>>>>>> resumeJob success, triggerKey:{}", triggerKey);
|
|
|
+ } else {
|
|
|
+ logger.info(">>>>>>>>>>> resumeJob fail, triggerKey:{}", triggerKey);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|