背景
定时任务是一个比较常见的功能,在某些情况下,需要重新启动或者是重设Scheduler Job,但是官方的API上都没有提供类似restart的方法,那该如何完成此需求呢?
Spring Quartz
Spring Quartz是一整套完整的Cron Job架构,可以完成复杂的任务调度需求,支持任务持久化,事务化,甚至分布式。如果是基于Spring Quartz做的Scheduler,那么重启比较简单,Task的管理类Scheduler提供了非常多的方法,如scheduleJob,unscheduleJob,rescheduleJob,deleteJob,addJob等,通过这些方法的组合就以达到重启的目的,参考此回答。
Spring Scheduler
Spring Scheduler相对于Spring Quartz来说更简单,不需要额外引入Quartz的包,能够实现简单的任务调度功能。它内部基于JDK的定时任务线程池ScheduledExecutorService实现,由类ScheduledTaskRegistrar来负责定时任务的注册,该类定义了一些操作task的方法。类TaskScheduler负责对JDK类ScheduledExecutorService的包装
Spring创建Schedle有两种比较常见的方式:
- 标注@Scheduled注解
- 实现SchedulingConfigurer接口
实现SchedulingConfigurer接口的方式
SchedulingConfigurer接口只有一个方法,用来做定时任务的定制化。以下是一个简单例子
@Configuration
@EnableScheduling //开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 手动配置,添加任务
taskRegistrar.addTriggerTask(...);
taskRegistrar.scheduleCronTask(...);
}
}
用这种方式,因为可以拿到任务注册类ScheduledTasksRegistrar,重启任务也比较简单。
ScheduledTasksRegistrar提供了getScheduledTasks方法,可以拿到所有注册上来的任务信息,ScheduledTask包装了Task的Future信息。只要遍历这些task,逐个调用cancel方法,即可停止任务。
Set<ScheduledTask> tasks = taskRegistrar.getScheduledTasks();
for (ScheduledTask task : tasks) {
task.cancel();
}
然后再通过ScheduledTaskRegistrar重新设置任务即可。
标注@Scheduled注解的方式
用注解的方式配置定时任务,这种方法