155 lines
4.8 KiB
Java
155 lines
4.8 KiB
Java
package com.cnbm.scheduletask.utils;
|
|
|
|
import com.cnbm.common.constant.Constant;
|
|
import com.cnbm.common.exception.ErrorCode;
|
|
import com.cnbm.common.exception.RenException;
|
|
import com.cnbm.scheduletask.entity.ScheduleJobEntity;
|
|
import org.quartz.*;
|
|
|
|
|
|
/**
|
|
* @Author weihongyang
|
|
* @Date 2022/6/23 4:40 PM
|
|
* @Version 1.0
|
|
*/
|
|
public class ScheduleUtils {
|
|
private final static String JOB_NAME = "TASK_";
|
|
/**
|
|
* 任务调度参数key
|
|
*/
|
|
public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
|
|
|
|
/**
|
|
* 获取触发器key
|
|
*/
|
|
public static TriggerKey getTriggerKey(Long jobId) {
|
|
return TriggerKey.triggerKey(JOB_NAME + jobId);
|
|
}
|
|
|
|
/**
|
|
* 获取jobKey
|
|
*/
|
|
public static JobKey getJobKey(Long jobId) {
|
|
return JobKey.jobKey(JOB_NAME + jobId);
|
|
}
|
|
|
|
/**
|
|
* 获取表达式触发器
|
|
*/
|
|
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
|
|
try {
|
|
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建定时任务
|
|
*/
|
|
public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
|
|
try {
|
|
//构建job信息
|
|
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getId())).build();
|
|
|
|
//表达式调度构建器
|
|
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
|
|
.withMisfireHandlingInstructionDoNothing();
|
|
|
|
//按新的cronExpression表达式构建一个新的trigger
|
|
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getId())).withSchedule(scheduleBuilder).build();
|
|
|
|
//放入参数,运行时的方法可以获取
|
|
jobDetail.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
|
|
|
|
scheduler.scheduleJob(jobDetail, trigger);
|
|
|
|
//暂停任务
|
|
if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
|
|
pauseJob(scheduler, scheduleJob.getId());
|
|
}
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新定时任务
|
|
*/
|
|
public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
|
|
try {
|
|
TriggerKey triggerKey = getTriggerKey(scheduleJob.getId());
|
|
|
|
//表达式调度构建器
|
|
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
|
|
.withMisfireHandlingInstructionDoNothing();
|
|
|
|
CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getId());
|
|
|
|
//按新的cronExpression表达式重新构建trigger
|
|
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
|
|
|
|
//参数
|
|
trigger.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
|
|
|
|
scheduler.rescheduleJob(triggerKey, trigger);
|
|
|
|
//暂停任务
|
|
if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
|
|
pauseJob(scheduler, scheduleJob.getId());
|
|
}
|
|
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 立即执行任务
|
|
*/
|
|
public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
|
|
try {
|
|
//参数
|
|
JobDataMap dataMap = new JobDataMap();
|
|
dataMap.put(JOB_PARAM_KEY, scheduleJob);
|
|
|
|
scheduler.triggerJob(getJobKey(scheduleJob.getId()), dataMap);
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 暂停任务
|
|
*/
|
|
public static void pauseJob(Scheduler scheduler, Long jobId) {
|
|
try {
|
|
scheduler.pauseJob(getJobKey(jobId));
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 恢复任务
|
|
*/
|
|
public static void resumeJob(Scheduler scheduler, Long jobId) {
|
|
try {
|
|
scheduler.resumeJob(getJobKey(jobId));
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除定时任务
|
|
*/
|
|
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
|
|
try {
|
|
scheduler.deleteJob(getJobKey(jobId));
|
|
} catch (SchedulerException e) {
|
|
throw new RenException(ErrorCode.JOB_ERROR, e);
|
|
}
|
|
}
|
|
}
|