SpringBoot Quartz指定时间执行任务及取消未执行的定时任务
使用quartz实现周期执行任务。遇到需要指定时间执行任务的需求,第一时间考虑到了Timer定时,简单好用。但是业务中需要你 取消该定时任务、并且 考虑大量定时任务的时候。Timer就显得有些力不从心了。底层机制: Timer走后台进行定时任务,Quartz能使用多个线程执行定时任务
Timer管理并发任务的缺陷:
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符。
当任务抛出异常时的缺陷,如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行。
Quartz指定时间执行任务
一:添加依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.1</version>
</dependency>
二:实例化需要定时的任务
需要定时的任务必须实现Job(org.quartz.Job)这个接口,实现这个接口需要实例化
**void execute(JobExecutionContext jobExecutionContext)**这个方法。
在这个方法里面编写自己需要实现执行的任务:
三:构建一个JobBuilder的实例
JobDetail jobDetail=JobBuilder
.newJob(自己实例化的定时任务.class)
.withIdentity("任务名","组名")
.build();
参数解释:
自己实例化的定时任务:ClockTask(第一步 中自己实例化的任务)
任务名:Task1(自己命名)
组名:group1(自己命名,便于对这个组里的任务进行管理)
四:编写触发器
很重要,很重要
Quartz提供了多种触发器:
Tigger
SimpleTrigger
CronTrigger
CalendarIntervalTrigger
CoreTrigger
DailyTimeIntervalTrigger等
这里用到的是SimpleTrigger触发器实现的指定时间执行
SimpleTrigger simple=TriggerBuilder.newTrigger()
.withIdentity("task1","group1")
.startAt(new Date())
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(0)
.withRepeatCount(0))
.build();
参数解释:
withIdentity(“task1”,“group1”):这里的任务名和组名与我第三步设置的相同
.startAt:这里输入一个Date类型的时间,指定这个任务什么时候执行
.withIntervalInSeconds(0):每隔多少秒执行一次
withRepeatCount(0):这里输入想要重复执行的次数
五:通过Scheduler调度器来调度
@Autowired
private Scheduler scheduler;
scheduler.scheduleJob(jobDetail,simple);
scheduler.start();
参数解释:
jobDetail:第三步构建的JobBuilder的实例
simple:第四步构建的触发器
六:取消未执行的定时任务
用第五步的scheduler
scheduler.deleteJob(new JobKey("task1","group1"));
参数解释:
删除group组里名为task1的定时任务
七:如何向execute方法里传参
通过第三步构建出来的jobDetail 以map的形式传值
jobDetail.getJobDataMap.put("aaa","AAA")
在第二步的execute的方法里
jobExecutionContext.getJobDataMap().get("aaa")
能往execute传参真的能解决了很多问题