package com.stylefeng.guns.modular.system.util.quartz;
|
|
import com.stylefeng.guns.modular.system.util.quartz.model.QuartzEnum;
|
import com.stylefeng.guns.modular.system.util.quartz.model.QuartzJob;
|
import lombok.extern.slf4j.Slf4j;
|
import org.quartz.*;
|
import org.quartz.impl.matchers.GroupMatcher;
|
|
import java.io.InputStream;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Set;
|
import java.util.stream.Collectors;
|
|
/**
|
* quartz任务调度工具类
|
* @author zhibing.pu
|
* @Date 2024/3/20 11:12
|
*/
|
@Slf4j
|
public class QuartzUtil {
|
/**
|
* 构建调度器
|
*/
|
public static Scheduler scheduler;
|
|
|
/**
|
* 启动调度器
|
* @param propertiesStream 配置文件流
|
* @return
|
*/
|
public static void start(InputStream propertiesStream){
|
if(null == scheduler){
|
scheduler = SchedulerUtil.getScheduler(propertiesStream);
|
}
|
try {
|
scheduler.start();
|
log.info(QuartzEnum.SCHEDULER_START_SUCCESS.getValue());
|
} catch (SchedulerException e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
|
|
|
/**
|
* 添加普通定时任务
|
* @param quartzJob 任务类
|
* @param startTime 任务开始执行时间,为空则立即执行
|
* @param intervalInMilliseconds 执行间隔毫秒数
|
* @param repeatCount 重复执行次数,-1表示永远执行
|
* @throws SchedulerException
|
*/
|
public static void addSimpleQuartzTask(QuartzJob quartzJob, Date startTime, long intervalInMilliseconds, int repeatCount) throws SchedulerException {
|
if(null == scheduler){
|
log.error("请先加载任务调取器");
|
return;
|
}
|
JobDetail jobDetail = getJobDetail(quartzJob);
|
Trigger simpleTrigger = getSimpleTrigger(quartzJob, startTime, intervalInMilliseconds, repeatCount);
|
scheduler.scheduleJob(jobDetail, simpleTrigger);
|
log.info(QuartzEnum.ADD_SIMPLE_TRIGGER_SUCCESS.getValue());
|
}
|
|
|
|
/**
|
* 添加Cron表达式的定时任务
|
* @param quartzJob 任务类
|
* @param cron cron表达式
|
* @throws SchedulerException
|
*/
|
public static void addCronQuartzTask(QuartzJob quartzJob, String cron) throws SchedulerException {
|
if(null == scheduler){
|
log.error("请先加载任务调取器");
|
return;
|
}
|
JobDetail jobDetail = getJobDetail(quartzJob);
|
Trigger cronTrigger = getCronTrigger(quartzJob, cron);
|
scheduler.scheduleJob(jobDetail, cronTrigger);
|
log.info(QuartzEnum.ADD_CRON_TRIGGER_SUCCESS.getValue());
|
}
|
|
|
/**
|
* 删除任务
|
* @param name 任务名称
|
* @param group 任务分组
|
* @return
|
*/
|
public static boolean deleteQuartzTask(String name, String group){
|
JobKey jobKey = new JobKey(name, group);
|
boolean b = false;
|
try {
|
b = scheduler.deleteJob(jobKey);
|
} catch (SchedulerException e) {
|
throw new RuntimeException(e);
|
}
|
return b;
|
}
|
|
/**
|
* 删除任务
|
* @param jobKey
|
* @return
|
*/
|
public static boolean deleteQuartzTask(JobKey jobKey){
|
boolean b = false;
|
try {
|
b = scheduler.deleteJob(jobKey);
|
} catch (SchedulerException e) {
|
throw new RuntimeException(e);
|
}
|
return b;
|
}
|
|
/**
|
* 删除分组下的所有定时任务
|
* @param group 分组名称
|
* @return
|
*/
|
public static boolean deleteGroupQuartzTask(String group){
|
try {
|
GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(group);
|
Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher);
|
boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList()));
|
if(!b){
|
return false;
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return false;
|
}
|
return true;
|
}
|
|
|
|
/**
|
* 清空所有定时任务
|
* @return
|
*/
|
public static boolean deleteAllQuartzTask(){
|
try {
|
List<String> jobGroupNames = scheduler.getJobGroupNames();
|
for (String jobGroupName : jobGroupNames) {
|
GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(jobGroupName);
|
Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher);
|
boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList()));
|
if(!b){
|
return false;
|
}
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
return false;
|
}
|
return true;
|
}
|
|
|
|
|
|
/**
|
* 构建任务描述JobDetail对象
|
* @param quartzJob 任务对象
|
* @return
|
*/
|
private static JobDetail getJobDetail(QuartzJob quartzJob){
|
String name = quartzJob.getName();
|
String group = quartzJob.getGroup();
|
if(null == name || "".equals(name)){
|
name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group || "".equals(group)){
|
group = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
return getJobDetail(quartzJob, name, group, quartzJob.getJobDataMap());
|
}
|
|
|
|
/**
|
* 构建任务描述JobDetail对象
|
* @param job 任务类
|
* @param job_name 任务名称
|
* @param group_name 任务分组名称
|
* @param jobDataMap 自定义参数
|
* @return
|
*/
|
private static JobDetail getJobDetail(Job job, String job_name, String group_name, JobDataMap jobDataMap){
|
JobDetail jobDetail = JobBuilder.newJob(job.getClass())
|
.withIdentity(job_name, group_name)
|
.setJobData(jobDataMap)
|
.build();
|
return jobDetail;
|
}
|
|
|
/**
|
* 构建Trigger执行器
|
* @param quartzJob 任务类
|
* @param startTime 任务开始执行时间,为空则立即执行
|
* @param intervalInMilliseconds 执行间隔毫秒数
|
* @param repeatCount 重读执行次数,-1表示永远执行
|
* @return
|
*/
|
private static Trigger getSimpleTrigger(QuartzJob quartzJob, Date startTime, long intervalInMilliseconds, int repeatCount){
|
String name = quartzJob.getName();
|
String group = quartzJob.getGroup();
|
if(null == name || "".equals(name)){
|
name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group || "".equals(group)){
|
group = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger();
|
if(null == startTime){
|
triggerTriggerBuilder.startNow();
|
}else{
|
triggerTriggerBuilder.startAt(startTime);
|
}
|
|
SimpleTrigger trigger = triggerTriggerBuilder
|
.withIdentity(name, group)
|
.withSchedule(
|
SimpleScheduleBuilder
|
.simpleSchedule()
|
.withIntervalInMilliseconds(intervalInMilliseconds)
|
.withRepeatCount(repeatCount)
|
).build();
|
return trigger;
|
}
|
|
|
/**
|
* 构建cronExpression表达式执行器
|
* @param quartzJob 任务类
|
* @param cron cron表达式
|
* @return
|
*/
|
private static Trigger getCronTrigger(QuartzJob quartzJob, String cron) {
|
String name = quartzJob.getName();
|
String group = quartzJob.getGroup();
|
if(null == name || "".equals(name)){
|
name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group || "".equals(group)){
|
group = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
CronTrigger trigger = TriggerBuilder.newTrigger()
|
.startNow()
|
.withIdentity(name, group)
|
.withSchedule(
|
CronScheduleBuilder.cronSchedule(cron)
|
).build();
|
return trigger;
|
}
|
|
|
}
|