重写Spring Boot定时任务,支持可动态调整执行时间

Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间、基本零配置就可以启动一个web服务。

定时任务在我们平常的业务开发用的非常多,Spring Boot创建一个定时任务很简单,只需要用@Scheduled注解方法,就可以让方法按照定义的时间进行运行。但是,Spring Boot的@Scheduled默认是单线程的,也就是如果有两个定时任务,那第二个定时必须在第一个定时任务执行完成之后才能开始执行。当然我们可以使用@Async让方法异步,来达到多线程的目的。但是,今天我要讲的是如何重写Spring Boot定时任务,并可支持动态调整执行时间。

1、定义我们需要定时触发的任务方法

重写Spring Boot定时任务,支持可动态调整执行时间

实例代码中我们定义了两个需要进行定时触发的任务。并且自定义注解@CronScheduled

2、自定义注解@CronScheduled

自定义注解的作用主要在于后续的逻辑可以获取到该方法的执行周期。同时也可以定义其它的属性,用于后续的业务逻辑处理

重写Spring Boot定时任务,支持可动态调整执行时间

3、注册定时任务

标题我们提出了支持可动态调整执行时间。平常的定时任务中我们没法动态调整执行时间,除非重启应用。那我们咋这里怎么动态调整时间呢?思路是:重新注册任务。当我们检测到定时任务的执行时间发生变化,我们就重新注册任务。如果我们的定时任务表达式是配置在数据库,那我们可以定时轮训数据库获取,检测到变化了就重新注册。如果是配置在配种中心,配置中心一般会有触发器trigger。当我们接受配置中心数据发生变化的通知以后,我们重新注册定时任务。

重写Spring Boot定时任务,支持可动态调整执行时间

重新注册任务的方法

重写Spring Boot定时任务,支持可动态调整执行时间

reReqiester方法可以暴露出去被其它类调用。当外部逻辑检测到定时任务的执行时间发生变化,调用此方法重新注册定时任务

ScheduledTaskRegistrar是Task的一个容器, 内部维护了这些Task List和executor的引用, 并负责将Task置入executor中执行。ScheduledTaskRegistrar的实现原理大家自行研究。这里就不进行详细解释。

实现BeanPostProcessor可以在ScheduleTask对象实例化以后,我们调用自己的逻辑方法。在这里我们用来触发configureTasks方法。

重写Spring Boot定时任务,支持可动态调整执行时间

至此,我们就自己实现了定时任务的调度,在调度的过程中,我们也可以加入自己逻辑处理业务。

您可能还会对下面的文章感兴趣: