Spring Scheduler重启的正确打开方式

本文探讨了在Spring框架中如何重启定时任务,特别是针对Spring Scheduler和Spring Quartz两种不同方式。Spring Quartz提供了丰富的API来操作任务,而Spring Scheduler虽然简单,但重启任务需要一些技巧。通过实现SchedulingConfigurer接口,可以通过ScheduledTasksRegistrar获取并停止任务,再重新设置。对于使用@Scheduled注解的方式,由于ScheduledAnnotationBeanPostProcessor的存在,可以直接调用其内部方法来重启任务,展示了Spring设计的灵活性。
摘要由CSDN通过智能技术生成

背景

定时任务是一个比较常见的功能,在某些情况下,需要重新启动或者是重设Scheduler Job,但是官方的API上都没有提供类似restart的方法,那该如何完成此需求呢?

Spring Quartz

Spring Quartz是一整套完整的Cron Job架构,可以完成复杂的任务调度需求,支持任务持久化,事务化,甚至分布式。如果是基于Spring Quartz做的Scheduler,那么重启比较简单,Task的管理类Scheduler提供了非常多的方法,如scheduleJobunscheduleJobrescheduleJobdeleteJobaddJob等,通过这些方法的组合就以达到重启的目的,参考此回答

Spring Scheduler

Spring Scheduler相对于Spring Quartz来说更简单,不需要额外引入Quartz的包,能够实现简单的任务调度功能。它内部基于JDK的定时任务线程池ScheduledExecutorService实现,由类ScheduledTaskRegistrar来负责定时任务的注册,该类定义了一些操作task的方法。类TaskScheduler负责对JDKScheduledExecutorService的包装
Scheduler Process

Spring创建Schedle有两种比较常见的方式:

  1. 标注@Scheduled注解
  2. 实现SchedulingConfigurer接口
实现SchedulingConfigurer接口的方式

SchedulingConfigurer接口只有一个方法,用来做定时任务的定制化。以下是一个简单例子

@Configuration      
@EnableScheduling   //开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {
   

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
   
        // 手动配置,添加任务
        taskRegistrar.addTriggerTask(...);
        taskRegistrar.scheduleCronTask(...);
    }
}

用这种方式,因为可以拿到任务注册类ScheduledTasksRegistrar,重启任务也比较简单。
ScheduledTasksRegistrar提供了getScheduledTasks方法,可以拿到所有注册上来的任务信息,ScheduledTask包装了TaskFuture信息。只要遍历这些task,逐个调用cancel方法,即可停止任务。

Set<ScheduledTask> tasks = taskRegistrar.getScheduledTasks();
for (ScheduledTask task : tasks) {
   
    task.cancel();
}

然后再通过ScheduledTaskRegistrar重新设置任务即可。

标注@Scheduled注解的方式

用注解的方式配置定时任务,这种方法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值