注意事项
文章只提供默认配置下quartz的集成及简单增删改。如需要更加复杂的功能可自行阅读官方api进行实现。
对quartz一点都不了解的可以阅读下面的文章。
[https://cloud.tencent.com/developer/article/1745977]
1.首先是引入POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.Quartz自带JOB类
继承QuartzJobBean ,实现你自己的业务逻辑即可。如有多个任务可新建多个类继承QuartzJobBean
public class AddWorkTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// jobExecutionContext.getTrigger().getJobDataMap(); 可以获取传入的参数
//TODO...这里实现你自己的业务逻辑
}
}
3. 为Quartz的增删改提供一个统一的接口
@Component
public class QuartzService {
private Logger logger = LoggerFactory.getLogger(QuartzService.class);
/**
* 注入Scheduler
*/
@Autowired
private Scheduler scheduler;
/**
* 新增任务
* @param clazz Job类
* @param name 名称
* @param group 组名
* @param cron 表达式
* @param data 额外传入的值
*/
public void addJobs(Class clazz,String name,String group,String cron,Object data){
JobDataMap jobDataMap=new JobDataMap();
if(data!=null){
jobDataMap=JSON.parseObject(JSON.toJSONString(data),JobDataMap.class);
}
logger.error("定时任务开始创建 名称:{} cron表达式:{}",name,cron);
JobDetail jobDetail = JobBuilder.newJob(clazz)
/**添加认证信息,有3种重写的方法,我这里是其中一种,可以查看源码看其余2种*/
.withIdentity(name,group)
.build();//执行
CronTrigger trigger = TriggerBuilder.newTrigger()
.usingJobData(jobDataMap)
/**添加认证信息,有3种重写的方法,我这里是其中一种,可以查看源码看其余2种*/
.withIdentity(name,group)
/**立即生效*/
.startNow()
/**添加执行规则,SimpleTrigger、CronTrigger的区别主要就在这里,我这里是demo,写了个每2分钟执行一次*/
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.build();//执行
try {
scheduler.scheduleJob(jobDetail, trigger);
logger.error("定时任务创建成功 名称:{} cron表达式:{}",name,cron);
} catch (SchedulerException e) {
logger.error("定时任务错误 名称:{} cron表达式:{}",name,cron);
e.printStackTrace();
}
}
/**
* 删除任务
* @param name 名称
* @param group 组
*/
public void deleteJobs(String name,String group){
logger.error("定时任务开始删除 名称:{} 组:{}",name,group);
JobKey jobKey = new JobKey(name,group);
try {
if (scheduler.checkExists(jobKey)) {
scheduler.deleteJob(jobKey);
logger.error("定时任务删除成功 名称:{} 组:{}",name,group);
}
} catch (SchedulerException e) {
logger.error("定时任务删除错误 名称:{} 组:{}",name,group);
e.printStackTrace();
}
}
/**
* 更新任务
* @param classes
* @param name
* @param group
* @param cron
*/
public void updateJobs(Class classes,String name,String group,String cron,Object data){
//删除原来的
deleteJobs(name,group);
//新增
addJobs(classes,name,group,cron,data);
}
}
4. 具体业务中的使用
quartzService使用@Autowired引入即可。
AddWorkTask.class 为上面实现业务逻辑的类。
taskDto.getId().toString() 以及TaskGroupConstant.WORK_TASK_GROUP
可以理解为 名称、组 一起组成了当前任务的唯一标识,修改以及删除都是根据名称和组进行查找
taskDto.getCron() 为 传入的cron表达式
taskDto为业务逻辑中可能需要传入的参数 可以为null
quartzService.addJobs(AddWorkTask.class,
taskDto.getId().toString(),
TaskGroupConstant.WORK_TASK_GROUP,
taskDto.getCron(),taskDto);