当前位置 博文首页 > RemainderTime:Spring boot(三) 使用quartz实现定时任务
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
</dependency>
package com.xf.mall.task;
import cn.hutool.core.date.DateUtil
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@Slf4j
public class CountTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("定时任务开始------");
log.info("业务逻辑:"+ DateUtil.date());
log.info("定时任务结束------");
}
}
@Data
public class TaskInfo implements Serializable {
private static final long serialVersionUID = -8054692082716173379L;
/**
* 任务名称
*/
private String jobName;
/**
* 任务分组
*/
private String jobGroup;
/**
* 任务描述
*/
private String jobDescription;
/**
* 任务表达式
*/
private String cronExpression;
/**
* 创建时间
*/
private String createTime;
}
public interface TaskService {
//添加任务
void addTask(TaskInfo taskInfo) throws SchedulerException;
//修改任务
void editTask(TaskInfo taskInfo);
//删除任务
void deleteJob(String jobName, String jobGroup);
//暂停任务
void pauseJob(String jobName, String jobGroup);
//恢复任务
void resumeJob(String jobName, String jobGroup);
}
@Slf4j
@Service
public class TaskServiceImpl implements TaskService {
@Autowired
private Scheduler scheduler;
/**
* 添加定时任务
* @param taskInfo 数据对象
*/
@Override
public void addTask(TaskInfo taskInfo) {
String jobName = taskInfo.getJobName(); //任务名称(完全限定名)
String jobGroup =taskInfo.getJobGroup(); //任务分组
String cronExpression =taskInfo.getCronExpression(); //任务表达式
String jobDescription = taskInfo.getJobDescription(); //任务描述
String createTime = DateUtil.formatTime(DateUtil.date()); //当前时间
try {
//判断任务是否存在
if(existJob(taskInfo.getJobName(),taskInfo.getJobGroup())){
log.info("该定时任务已存在");
throw new SchedulerException("该定时任务已存在");
}
//构建触发器
TriggerKey triggerKey=new TriggerKey(jobName,jobGroup);
//构建任务
JobKey jobKey=new JobKey(jobName,jobGroup);
//构建时间生成器
CronScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule(cronExpression)
.withMisfireHandlingInstructionDoNothing();
//构建时间触发器
CronTrigger cronTrigger=TriggerBuilder.newTrigger()
.withIdentity(triggerKey).withDescription(createTime)
.withSchedule(scheduleBuilder).build();
//加载定时任务对象
Class<? extends Job> clazz = (Class<? extends Job>) Class.forName(jobName);
//创建任务
JobDetail jobDetail=JobBuilder.newJob(clazz).withIdentity(jobKey)
.withDescription(jobDescription).build();
//加入任务
scheduler.scheduleJob(jobDetail,cronTrigger);
}
catch (Exception e){
LOGGER.info("保存定时任务-->类名不存在或执行表达式错误--->复杂调度" + e.getMessage());
new Exception("类名不存在或执行表达式错误");
}
}
/**
* 修改定时任务
* @param taskInfo 数据对象
*/
@Override
public void editTask(TaskInfo taskInfo) {
String jobName = taskInfo.getJobName();
String jobGroup =taskInfo.getJobGroup();
String cronExpression =taskInfo.getCronExpression();
String jobDescription = taskInfo.getJobDescription();
String createTime = DateUtil.formatTime(DateUtil.date());
try {
if(!existJob(taskInfo.getJobName(),taskInfo.getJobGroup())){
log.info("该定时任务不存在");
throw new SchedulerException("该定时任务不存在");
}
TriggerKey triggerKey=new TriggerKey(jobName,jobGroup);
JobKey jobKey=new JobKey(jobName,jobGroup);
CronScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule(cronExpression)
.withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger=TriggerBuilder.newTrigger()
.withIdentity(triggerKey).withDescription(createTime)
.withSchedule(scheduleBuilder).build();
//获取定时任务
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
jobDetail.getJobBuilder()
.withDescription(jobDescription);
//重新设置触发器
HashSet<Trigger> hashSet=new HashSet<>();
hashSet.add(cronTrigger);
scheduler.scheduleJob(jobDetail,hashSet,true);
}catch (Exception e){
LOGGER.info("修改定时任务-->类名不存在或执行表达式错误--->复杂调度" + e.getMessage());
new Exception("类名不存在或执行表达式错误"