|
@@ -0,0 +1,467 @@
|
|
|
|
+package com.xiesx.fastboot.core.scheduler;
|
|
|
|
+
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
|
|
+
|
|
|
|
+import org.apache.commons.lang3.ObjectUtils;
|
|
|
|
+import org.quartz.*;
|
|
|
|
+import org.quartz.impl.matchers.GroupMatcher;
|
|
|
|
+
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
+import com.google.common.collect.Maps;
|
|
|
|
+import com.xiesx.fastboot.SpringHelper;
|
|
|
|
+import com.xiesx.fastboot.core.exception.RunExc;
|
|
|
|
+import com.xiesx.fastboot.core.exception.RunException;
|
|
|
|
+
|
|
|
|
+public class ScheduleHelper {
|
|
|
|
+
|
|
|
|
+ private static Scheduler scheduler = SpringHelper.getBean(Scheduler.class);
|
|
|
|
+
|
|
|
|
+ private static String JOB_GROUP_NAME = "FAST_JOB_GROUP_NAME";
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加SimpleJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param interval 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
|
+ * @param repeat 运行的次数 (<0:表示不限次数)
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, Class<? extends Job> cls, int interval, int repeat) {
|
|
|
|
+ // 创建
|
|
|
|
+ addJob(job, cls, interval, repeat, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加SimpleJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param interval 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
|
+ * @param repeat 运行的次数 (<0:表示不限次数)
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, Class<? extends Job> cls, int interval, int repeat,
|
|
|
|
+ Map<? extends String, ? extends Object> data) {
|
|
|
|
+ // 构建SimpleScheduleBuilder规则
|
|
|
|
+ SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule() // 几秒钟重复执行
|
|
|
|
+ .withIntervalInSeconds(interval);
|
|
|
|
+ if (repeat > 0) {
|
|
|
|
+ // 重复次数
|
|
|
|
+ simpleScheduleBuilder.withRepeatCount(repeat);
|
|
|
|
+ }
|
|
|
|
+ // 一直执行
|
|
|
|
+ simpleScheduleBuilder.repeatForever();
|
|
|
|
+ // 创建
|
|
|
|
+ createJob(job, cls, simpleScheduleBuilder, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加SimpleJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param group 任务组名
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param interval 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
|
+ * @param repeat 运行的次数 (<0:表示不限次数)
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, String group, Class<? extends Job> cls, int interval, int repeat,
|
|
|
|
+ Map<? extends String, ? extends Object> data) {
|
|
|
|
+ // 构建SimpleScheduleBuilder规则
|
|
|
|
+ SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
|
|
|
|
+ // 几秒钟重复执行
|
|
|
|
+ .withIntervalInSeconds(interval);
|
|
|
|
+ if (repeat > 0) {
|
|
|
|
+ // 重复次数
|
|
|
|
+ simpleScheduleBuilder.withRepeatCount(repeat);
|
|
|
|
+ }
|
|
|
|
+ // 一直执行
|
|
|
|
+ simpleScheduleBuilder.repeatForever();
|
|
|
|
+ // 创建
|
|
|
|
+ createJob(job, group, cls, simpleScheduleBuilder, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加CronJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param cron 时间表达式 (如:0/5 * * * * ? )
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, Class<? extends Job> cls, String cron) {
|
|
|
|
+ addJob(job, cls, cron, null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加CronJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param cron 时间表达式 (如:0/5 * * * * ? )
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, Class<? extends Job> cls, String cron, Map<? extends String, ? extends Object> data) {
|
|
|
|
+ // 构建CronScheduleBuilder规则
|
|
|
|
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
|
|
|
|
+ // 创建
|
|
|
|
+ createJob(job, cls, cronScheduleBuilder, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 增加CronJob
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param group 任务组名
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param cron 时间表达式 (如:0/5 * * * * ? )
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void addJob(String job, String group, Class<? extends Job> cls, String cron,
|
|
|
|
+ Map<? extends String, ? extends Object> data) {
|
|
|
|
+ // 构建CronScheduleBuilder规则
|
|
|
|
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
|
|
|
|
+ // 创建
|
|
|
|
+ createJob(job, group, cls, cronScheduleBuilder, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 创建
|
|
|
|
+ *
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param ScheduleBuilder 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void createJob(String job, Class<? extends Job> cls, ScheduleBuilder<? extends Trigger> ScheduleBuilder,
|
|
|
|
+ Map<? extends String, ? extends Object> data) {
|
|
|
|
+ createJob(job, JOB_GROUP_NAME, cls, ScheduleBuilder, data);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 创建
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param group 任务组名
|
|
|
|
+ * @param cls 任务实现类
|
|
|
|
+ * @param interval 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
|
+ * @param repeat 运行的次数 (<0:表示不限次数)
|
|
|
|
+ * @param data 参数
|
|
|
|
+ */
|
|
|
|
+ public static void createJob(String job, String group, Class<? extends Job> cls, ScheduleBuilder<? extends Trigger> ScheduleBuilder,
|
|
|
|
+ Map<? extends String, ? extends Object> data) {
|
|
|
|
+ try {
|
|
|
|
+ // 构建实例
|
|
|
|
+ JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job, group).build();
|
|
|
|
+ // 设置参数
|
|
|
|
+ if (data != null && data.size() > 0) {
|
|
|
|
+ jobDetail.getJobDataMap().putAll(data);
|
|
|
|
+ }
|
|
|
|
+ // 构建触发器
|
|
|
|
+ TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(job, group);
|
|
|
|
+ triggerBuilder.withSchedule(ScheduleBuilder);
|
|
|
|
+ triggerBuilder.startNow();
|
|
|
|
+ scheduler.scheduleJob(jobDetail, triggerBuilder.build());
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改
|
|
|
|
+ *
|
|
|
|
+ * @param cron
|
|
|
|
+ */
|
|
|
|
+ public static void updateJob(String job, int interval, int repeat) {
|
|
|
|
+ updateJob(job, JOB_GROUP_NAME, interval, repeat);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改
|
|
|
|
+ *
|
|
|
|
+ * @param cron
|
|
|
|
+ */
|
|
|
|
+ public static void updateJob(String job, String cron) {
|
|
|
|
+ updateJob(job, JOB_GROUP_NAME, cron);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改
|
|
|
|
+ *
|
|
|
|
+ * @param job
|
|
|
|
+ * @param group
|
|
|
|
+ * @param cron
|
|
|
|
+ */
|
|
|
|
+ public static void updateJob(String job, String group, int interval, int repeat) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(job, group);
|
|
|
|
+ SimpleTrigger trigger = (SimpleTrigger) scheduler.getTrigger(triggerKey);
|
|
|
|
+ //
|
|
|
|
+ SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule() // 几秒钟重复执行
|
|
|
|
+ .withIntervalInSeconds(interval);
|
|
|
|
+ if (repeat > 0) {
|
|
|
|
+ // 重复次数
|
|
|
|
+ simpleScheduleBuilder.withRepeatCount(repeat);
|
|
|
|
+ }
|
|
|
|
+ // 一直执行
|
|
|
|
+ simpleScheduleBuilder.repeatForever();
|
|
|
|
+ trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(simpleScheduleBuilder).build();
|
|
|
|
+ // 重启触发器
|
|
|
|
+ scheduler.rescheduleJob(triggerKey, trigger);
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 修改
|
|
|
|
+ *
|
|
|
|
+ * @param job
|
|
|
|
+ * @param group
|
|
|
|
+ * @param cron
|
|
|
|
+ */
|
|
|
|
+ public static void updateJob(String job, String group, String cron) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(job, group);
|
|
|
|
+ CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
|
|
|
+ //
|
|
|
|
+ trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
|
|
|
|
+ // 重启触发器
|
|
|
|
+ scheduler.rescheduleJob(triggerKey, trigger);
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 删除
|
|
|
|
+ */
|
|
|
|
+ public static void deleteJob(String job) {
|
|
|
|
+ deleteJob(job, JOB_GROUP_NAME);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 删除
|
|
|
|
+ *
|
|
|
|
+ * @param job 任务名称
|
|
|
|
+ * @param group 任务组名
|
|
|
|
+ */
|
|
|
|
+ public static void deleteJob(String job, String group) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ scheduler.deleteJob(new JobKey(job, group));
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 暂停
|
|
|
|
+ */
|
|
|
|
+ public static void pauseJob(String job) {
|
|
|
|
+ pauseJob(job, JOB_GROUP_NAME);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 暂停
|
|
|
|
+ *
|
|
|
|
+ * @param job
|
|
|
|
+ * @param group
|
|
|
|
+ */
|
|
|
|
+ public static void pauseJob(String job, String group) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JobKey jobKey = JobKey.jobKey(job, group);
|
|
|
|
+ scheduler.pauseJob(jobKey);
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 恢复
|
|
|
|
+ */
|
|
|
|
+ public static void resumeJob(String job) {
|
|
|
|
+ resumeJob(job, JOB_GROUP_NAME);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 恢复
|
|
|
|
+ *
|
|
|
|
+ * @param job
|
|
|
|
+ * @param group
|
|
|
|
+ */
|
|
|
|
+ public static void resumeJob(String job, String group) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JobKey jobKey = JobKey.jobKey(job, group);
|
|
|
|
+ scheduler.resumeJob(jobKey);
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 立即执行
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+ public static void runJobNow(String job) {
|
|
|
|
+ resumeJob(job, JOB_GROUP_NAME);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 立即执行
|
|
|
|
+ *
|
|
|
|
+ * @param job
|
|
|
|
+ * @param group
|
|
|
|
+ */
|
|
|
|
+ public static void runJobNow(String job, String group) {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ JobKey jobKey = JobKey.jobKey(job, group);
|
|
|
|
+ scheduler.triggerJob(jobKey);
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // ============================
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 启动任务
|
|
|
|
+ *
|
|
|
|
+ * @throws SchedulerException
|
|
|
|
+ */
|
|
|
|
+ public static void startJobs() {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ scheduler.start();
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 关闭任务
|
|
|
|
+ *
|
|
|
|
+ * @throws SchedulerException
|
|
|
|
+ */
|
|
|
|
+ public static void shutdownJobs() {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ if (!scheduler.isShutdown()) {
|
|
|
|
+ scheduler.shutdown();
|
|
|
|
+ }
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取所有计划中的任务列表
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static List<Map<String, Object>> queryAllJob() {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ List<Map<String, Object>> jobList = null;
|
|
|
|
+ try {
|
|
|
|
+ GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
|
|
|
|
+ Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
|
|
|
|
+ jobList = Lists.newArrayList();
|
|
|
|
+ for (JobKey jobKey : jobKeys) {
|
|
|
|
+ List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
|
|
|
|
+ for (Trigger trigger : triggers) {
|
|
|
|
+ Map<String, Object> map = Maps.newHashMap();
|
|
|
|
+ map.put("key", trigger.getKey());
|
|
|
|
+ map.put("job", jobKey.getName());
|
|
|
|
+ map.put("group", jobKey.getGroup());
|
|
|
|
+ Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
|
|
|
+ map.put("status", triggerState.name());
|
|
|
|
+ if (trigger instanceof CronTrigger) {
|
|
|
|
+ CronTrigger cronTrigger = (CronTrigger) trigger;
|
|
|
|
+ String cronExpression = cronTrigger.getCronExpression();
|
|
|
|
+ map.put("cron", cronExpression);
|
|
|
|
+ }
|
|
|
|
+ jobList.add(map);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return jobList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取所有正在运行的job
|
|
|
|
+ *
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static List<Map<String, Object>> queryRunJob() {
|
|
|
|
+ if (ObjectUtils.isEmpty(scheduler)) {
|
|
|
|
+ throw new RunException(RunExc.RUNTIME, "please check pom.xml -> spring-boot-starter-quartz");
|
|
|
|
+ }
|
|
|
|
+ List<Map<String, Object>> jobList = null;
|
|
|
|
+ try {
|
|
|
|
+ List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
|
|
|
|
+ jobList = new ArrayList<>(executingJobs.size());
|
|
|
|
+ for (JobExecutionContext executingJob : executingJobs) {
|
|
|
|
+ Map<String, Object> map = Maps.newHashMap();
|
|
|
|
+ JobDetail jobDetail = executingJob.getJobDetail();
|
|
|
|
+ JobKey jobKey = jobDetail.getKey();
|
|
|
|
+ Trigger trigger = executingJob.getTrigger();
|
|
|
|
+ map.put("key", trigger.getKey());
|
|
|
|
+ map.put("job", jobKey.getName());
|
|
|
|
+ map.put("group", jobKey.getGroup());
|
|
|
|
+ Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
|
|
|
+ map.put("status", triggerState.name());
|
|
|
|
+ if (trigger instanceof CronTrigger) {
|
|
|
|
+ CronTrigger cronTrigger = (CronTrigger) trigger;
|
|
|
|
+ String cronExpression = cronTrigger.getCronExpression();
|
|
|
|
+ map.put("cron", cronExpression);
|
|
|
|
+ }
|
|
|
|
+ jobList.add(map);
|
|
|
|
+ }
|
|
|
|
+ } catch (SchedulerException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ return jobList;
|
|
|
|
+ }
|
|
|
|
+}
|