SpringBoot Quartz指定时间执行任务及取消该定时任务

SpringBoot Quartz指定时间执行任务及取消未执行的定时任务

    • Quartz指定时间执行任务
      • 一:导入依赖
      • 二:实例化需要定时的任务
      • 三:构建一个JobBuilder的实例
      • 四:**编写触发器**
      • 五:通过Scheduler调度器来调度
    • 取消未执行的定时任务
    • 如何向execute方法里传参

之前都是使用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)**这个方法。
在这个方法里面编写自己需要实现执行的任务
SpringBoot Quartz指定时间执行任务及取消该定时任务_第1张图片

三:构建一个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("love","我爱你")

在第二步的execute的方法里

jobExecutionContext.getJobDataMap().get("love")

能往execute传参真的能解决了很多问题
如有错误,还望指正!

你可能感兴趣的:(经验分享)