package com.stylefeng.guns.modular.system.util.quartz;
|
|
import com.stylefeng.guns.modular.system.util.quartz.model.QuartzEnum;
|
import lombok.extern.slf4j.Slf4j;
|
import org.quartz.*;
|
import org.quartz.impl.matchers.GroupMatcher;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
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
|
@Component
|
public class QuartzUtil {
|
|
@Autowired
|
private Scheduler scheduler;
|
|
/**
|
* 构建Trigger执行器
|
* @param startTime 任务开始执行时间,为空则立即执行
|
* @param intervalInMilliseconds 执行间隔毫秒数
|
* @param repeatCount 重读执行次数,-1表示永远执行
|
* @return
|
*/
|
private static Trigger getSimpleTrigger(String job_name, String group_name, Date startTime, long intervalInMilliseconds, int repeatCount){
|
if(null == job_name || "".equals(job_name)){
|
job_name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group_name || "".equals(group_name)){
|
group_name = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger();
|
if(null == startTime){
|
triggerTriggerBuilder.startNow();
|
}else{
|
triggerTriggerBuilder.startAt(startTime);
|
}
|
|
SimpleTrigger trigger = triggerTriggerBuilder
|
.withIdentity(job_name, group_name)
|
.withSchedule(
|
SimpleScheduleBuilder
|
.simpleSchedule()
|
.withIntervalInMilliseconds(intervalInMilliseconds)
|
.withRepeatCount(repeatCount)
|
).build();
|
return trigger;
|
}
|
|
/**
|
* 构建cronExpression表达式执行器
|
* @param cron cron表达式
|
* @return
|
*/
|
private static Trigger getCronTrigger(String job_name, String group_name, String cron) {
|
if(null == job_name || "".equals(job_name)){
|
job_name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group_name || "".equals(group_name)){
|
group_name = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
CronTrigger trigger = TriggerBuilder.newTrigger()
|
.startNow()
|
.withIdentity(job_name, group_name)
|
.withSchedule(
|
CronScheduleBuilder.cronSchedule(cron)
|
).build();
|
return trigger;
|
}
|
|
/**
|
* 添加普通定时任务
|
* @param startTime 任务开始执行时间,为空则立即执行
|
* @param intervalInMilliseconds 执行间隔毫秒数
|
* @param repeatCount 重复执行次数,-1表示永远执行
|
* @throws SchedulerException
|
*/
|
public void addSimpleQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, Date startTime, long intervalInMilliseconds, int repeatCount) throws SchedulerException {
|
JobKey jobKey = JobKey.jobKey(job_name, group_name);
|
if(scheduler.checkExists(jobKey)){
|
log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey);
|
return;
|
}
|
// 构建 Job
|
JobDetail job = JobBuilder.newJob(clazz)
|
.setJobData(jobDataMap)
|
.withIdentity(jobKey).build();
|
// 构建 Trigger
|
Trigger trigger = getSimpleTrigger(job_name, group_name, startTime, intervalInMilliseconds, repeatCount);
|
// 启动调度器
|
scheduler.scheduleJob(job, trigger);
|
scheduler.start();
|
}
|
|
/**
|
* 添加Cron表达式的定时任务
|
* @param cron cron表达式
|
* @throws SchedulerException
|
*/
|
public void addCronQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, String cron) throws SchedulerException {
|
JobKey jobKey = JobKey.jobKey(job_name, group_name);
|
if(scheduler.checkExists(jobKey)){
|
log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey);
|
return;
|
}
|
// 构建 Job
|
JobDetail job = JobBuilder.newJob(clazz)
|
.setJobData(jobDataMap)
|
.withIdentity(jobKey).build();
|
// 构建 Trigger
|
Trigger trigger = getCronTrigger(job_name, group_name, cron);
|
// 启动调度器
|
scheduler.scheduleJob(job, trigger);
|
scheduler.start();
|
}
|
|
/**
|
* 删除任务
|
* @param name 任务名称
|
* @param group 任务分组
|
* @return
|
*/
|
public 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 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 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 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对象
|
* @return
|
*/
|
private JobDetail getJobDetail(Job job, String job_name, String group_name){
|
if(null == job_name || "".equals(job_name)){
|
job_name = QuartzEnum.JOB_NAME.getValue();
|
}
|
if(null == group_name || "".equals(group_name)){
|
group_name = QuartzEnum.DEFAULT_GROUP.getValue();
|
}
|
return getJobDetail(job, job_name, group_name, null);
|
}
|
|
/**
|
* 构建任务描述JobDetail对象
|
* @param job 任务类
|
* @param job_name 任务名称
|
* @param group_name 任务分组名称
|
* @param jobDataMap 自定义参数
|
* @return
|
*/
|
private 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;
|
}
|
|
|
}
|