|
@@ -0,0 +1,254 @@
|
|
|
+package com.qmth.distributed.print.task.service.impl;
|
|
|
+
|
|
|
+import com.qmth.distributed.print.task.service.QuartzService;
|
|
|
+import org.quartz.*;
|
|
|
+import org.quartz.impl.matchers.GroupMatcher;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.scheduling.quartz.QuartzJobBean;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description: quartz 服务实现类
|
|
|
+ * @Param:
|
|
|
+ * @return:
|
|
|
+ * @Author: wangliang
|
|
|
+ * @Date: 2020/7/1
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class QuartzServiceImpl implements QuartzService {
|
|
|
+ private final static Logger log = LoggerFactory.getLogger(QuartzServiceImpl.class);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private Scheduler scheduler;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增加一个job
|
|
|
+ *
|
|
|
+ * @param jobClass 任务实现类
|
|
|
+ * @param jobName 任务名称
|
|
|
+ * @param jobGroupName 任务组名
|
|
|
+ * @param jobTime 时间表达式 (这是每隔多少秒为一次任务)
|
|
|
+ * @param jobTimes 运行的次数 (<0:表示不限次数)
|
|
|
+ * @param jobData 参数
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, int jobTime,
|
|
|
+ int jobTimes, Map jobData) {
|
|
|
+ try {
|
|
|
+ // 任务名称和组构成任务key
|
|
|
+ JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
|
|
|
+ .build();
|
|
|
+ // 设置job参数
|
|
|
+ if (jobData != null && jobData.size() > 0) {
|
|
|
+ jobDetail.getJobDataMap().putAll(jobData);
|
|
|
+ }
|
|
|
+ // 使用simpleTrigger规则
|
|
|
+ Trigger trigger = null;
|
|
|
+ if (jobTimes < 0) {
|
|
|
+ trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
|
|
|
+ .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime))
|
|
|
+ .startNow().build();
|
|
|
+ } else {
|
|
|
+ trigger = TriggerBuilder
|
|
|
+ .newTrigger().withIdentity(jobName, jobGroupName).withSchedule(SimpleScheduleBuilder
|
|
|
+ .repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes))
|
|
|
+ .startNow().build();
|
|
|
+ }
|
|
|
+ scheduler.scheduleJob(jobDetail, trigger);
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增加一个job
|
|
|
+ *
|
|
|
+ * @param jobClass 任务实现类
|
|
|
+ * @param jobName 任务名称(建议唯一)
|
|
|
+ * @param jobGroupName 任务组名
|
|
|
+ * @param jobTime 时间表达式 (如:0/5 * * * * ? )
|
|
|
+ * @param jobData 参数
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void addJob(Class<? extends QuartzJobBean> jobClass, String jobName, String jobGroupName, String jobTime, Map jobData) {
|
|
|
+ try {
|
|
|
+ // 创建jobDetail实例,绑定Job实现类
|
|
|
+ // 指明job的名称,所在组的名称,以及绑定job类
|
|
|
+ // 任务名称和组构成任务key
|
|
|
+ JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName)
|
|
|
+ .build();
|
|
|
+ // 设置job参数
|
|
|
+ if (jobData != null && jobData.size() > 0) {
|
|
|
+ jobDetail.getJobDataMap().putAll(jobData);
|
|
|
+ }
|
|
|
+ // 定义调度触发规则
|
|
|
+ // 使用cornTrigger规则
|
|
|
+ // 触发器key
|
|
|
+ Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)
|
|
|
+ .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND))
|
|
|
+ .withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).startNow().build();
|
|
|
+ // 把作业和触发器注册到任务调度中
|
|
|
+ scheduler.scheduleJob(jobDetail, trigger);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改一个job的 时间表达式
|
|
|
+ *
|
|
|
+ * @param jobName
|
|
|
+ * @param jobGroupName
|
|
|
+ * @param jobTime
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void updateJob(String jobName, String jobGroupName, String jobTime) {
|
|
|
+ try {
|
|
|
+ TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
|
|
|
+ CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
|
|
|
+ trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
|
|
|
+ .withSchedule(CronScheduleBuilder.cronSchedule(jobTime)).build();
|
|
|
+ // 重启触发器
|
|
|
+ scheduler.rescheduleJob(triggerKey, trigger);
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除任务一个job
|
|
|
+ *
|
|
|
+ * @param jobName 任务名称
|
|
|
+ * @param jobGroupName 任务组名
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteJob(String jobName, String jobGroupName) {
|
|
|
+ try {
|
|
|
+ scheduler.deleteJob(new JobKey(jobName, jobGroupName));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 暂停一个job
|
|
|
+ *
|
|
|
+ * @param jobName
|
|
|
+ * @param jobGroupName
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void pauseJob(String jobName, String jobGroupName) {
|
|
|
+ try {
|
|
|
+ JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
|
|
+ scheduler.pauseJob(jobKey);
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 恢复一个job
|
|
|
+ *
|
|
|
+ * @param jobName
|
|
|
+ * @param jobGroupName
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void resumeJob(String jobName, String jobGroupName) {
|
|
|
+ try {
|
|
|
+ JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
|
|
+ scheduler.resumeJob(jobKey);
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 立即执行一个job
|
|
|
+ *
|
|
|
+ * @param jobName
|
|
|
+ * @param jobGroupName
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void runAJobNow(String jobName, String jobGroupName) {
|
|
|
+ try {
|
|
|
+ JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
|
|
|
+ scheduler.triggerJob(jobKey);
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有job
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> queryAllJob() {
|
|
|
+ List<Map<String, Object>> jobList = null;
|
|
|
+ try {
|
|
|
+ GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
|
|
|
+ Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
|
|
|
+ jobList = new ArrayList<Map<String, Object>>();
|
|
|
+ for (JobKey jobKey : jobKeys) {
|
|
|
+ List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
|
|
|
+ for (Trigger trigger : triggers) {
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put("jobName", jobKey.getName());
|
|
|
+ map.put("jobGroupName", jobKey.getGroup());
|
|
|
+ map.put("description", "触发器:" + trigger.getKey());
|
|
|
+ Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
|
|
+ map.put("jobStatus", triggerState.name());
|
|
|
+ if (trigger instanceof org.springframework.scheduling.support.CronTrigger) {
|
|
|
+ CronTrigger cronTrigger = (CronTrigger) trigger;
|
|
|
+ String cronExpression = cronTrigger.getCronExpression();
|
|
|
+ map.put("jobTime", cronExpression);
|
|
|
+ }
|
|
|
+ jobList.add(map);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ return jobList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有正在运行的job
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<Map<String, Object>> queryRunJob() {
|
|
|
+ List<Map<String, Object>> jobList = null;
|
|
|
+ try {
|
|
|
+ List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
|
|
|
+ jobList = new ArrayList<Map<String, Object>>(executingJobs.size());
|
|
|
+ for (JobExecutionContext executingJob : executingJobs) {
|
|
|
+ Map<String, Object> map = new HashMap<String, Object>();
|
|
|
+ JobDetail jobDetail = executingJob.getJobDetail();
|
|
|
+ JobKey jobKey = jobDetail.getKey();
|
|
|
+ Trigger trigger = executingJob.getTrigger();
|
|
|
+ map.put("jobName", jobKey.getName());
|
|
|
+ map.put("jobGroupName", jobKey.getGroup());
|
|
|
+ map.put("description", "触发器:" + trigger.getKey());
|
|
|
+ Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
|
|
|
+ map.put("jobStatus", triggerState.name());
|
|
|
+ if (trigger instanceof org.springframework.scheduling.support.CronTrigger) {
|
|
|
+ CronTrigger cronTrigger = (CronTrigger) trigger;
|
|
|
+ String cronExpression = cronTrigger.getCronExpression();
|
|
|
+ map.put("jobTime", cronExpression);
|
|
|
+ }
|
|
|
+ jobList.add(map);
|
|
|
+ }
|
|
|
+ } catch (SchedulerException e) {
|
|
|
+ log.error("请求出错", e);
|
|
|
+ }
|
|
|
+ return jobList;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|