/**
|
* Copyright (c) 2018 人人开源 All rights reserved.
|
*
|
* https://www.renren.io
|
*
|
* 版权所有,侵权必究!
|
*/
|
|
package com.iailab.module.data.job.utils;
|
|
import com.iailab.framework.common.constant.Constant;
|
import com.iailab.framework.common.enums.ErrorCode;
|
import com.iailab.framework.common.exception.ServerException;
|
import com.iailab.module.data.job.entity.ScheduleJobEntity;
|
import com.iailab.module.data.job.entity.ScheduleJobEntity;
|
import org.quartz.*;
|
|
/**
|
* 定时任务工具类
|
*
|
* @author Mark sunlightcs@gmail.com
|
*/
|
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 ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 创建定时任务
|
*/
|
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 ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 更新定时任务
|
*/
|
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 ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 立即执行任务
|
*/
|
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 ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 暂停任务
|
*/
|
public static void pauseJob(Scheduler scheduler, Long jobId) {
|
try {
|
scheduler.pauseJob(getJobKey(jobId));
|
} catch (SchedulerException e) {
|
throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 恢复任务
|
*/
|
public static void resumeJob(Scheduler scheduler, Long jobId) {
|
try {
|
scheduler.resumeJob(getJobKey(jobId));
|
} catch (SchedulerException e) {
|
throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
|
/**
|
* 删除定时任务
|
*/
|
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
|
try {
|
scheduler.deleteJob(getJobKey(jobId));
|
} catch (SchedulerException e) {
|
throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
|
}
|
}
|
}
|