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

createh51个月前 (03-20)技术教程5

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

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

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

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

2、自定义注解@CronScheduled

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

3、注册定时任务

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

重新注册任务的方法

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

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

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

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

相关文章

js基础之setTimeout与setInterval原理分析

setTimeout与setInterval概述setTimeout与setInterval是JavaScript引擎提供的两个定时器方法,分别用于函数的延时执行和循环调用。前者的主要思想是通过一个定...

Java三种方式实现redis分布式锁

一、引入原因在分布式服务中,常常有如定时任务、库存更新这样的场景。在定时任务中,如果不使用quartz这样的分布式定时工具,只是简单的使用定时器来进行定时任务,在服务分布式部署中,就有可能存在定时任务...

Netty 心跳检测

1. 前言本节,我们主要讲解心跳机制 heartbeat,Netty 给我们提供了三个 Handler,分别是 IdleStateHandler、ReadTimeoutHandler、WriteTim...

LOGO!常见的20钟故障和解决方法,别还心里没点谱

1: 为什么LOGO!第4个扩展模块DM8的输出点不能使用?因为LOGO!最多能支持16个数字量输出,LOGO!及前3个DM8扩展模块上的输出点加起来已经有16个数字量输出点了,因此最后一个DM8上的...

京东大佬问我,在SpringBoot中怎么使用时间轮?要考虑哪些方面?

京东大佬问我,什么是时间轮?为什么要用时间轮?在SpringBoot中怎么使用时间轮?要考虑哪些方面的问题呢?嗯,用户问到了时间轮,还有在Spring Boot中怎么用,需要考虑哪些问题。首先,我得先...

Java多线程七种线程池,你知道它们的用途、优缺点都是什么吗?

Java是一门广泛应用于后端开发的高级编程语言。在多线程编程中,线程池被广泛应用以优化性能。线程池通过控制线程数量、管理任务队列等方式来提高程序的响应速度、降低系统负载。Java中常用的线程池有以下七...