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

yumo6662周前 (09-01)技术文章11

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方法。

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

相关文章

C#实现定时器的几种方案_c定时器的使用

前几天写了一篇java的定时器方案,应小伙伴的要求,今天这里一下c#实现定时器的方案。 在C#里关于定时器类就有三个1、System.Windows.Forms.Timer2、System.Threa...

java:springBoot使用@Scheduled注解配置定时任务

定时任务的实现有多种,其中一种就是使用Spring提供的注解: @Schedule 。下面举个简单的例子1、先在springboot的入口处添加@EnableScheduling这个注解2、总开关添加...

Spring Boot 异步任务进阶实战:异常、定时与事务兼容

在 Spring Boot 开发中,异步任务是提升系统响应速度的关键手段,但实战中异常隐匿、定时调度、事务冲突三大坑常让开发者头疼。本文结合真实业务场景,拆解这三大问题的解决方案,帮你打造稳定灵活的异...

Spring整合quartz,quartz-scheduler定时任务,Spring定时任务

蕃薯耀 2016年7月5日 09:39:02 星期二http://fanshuyao.iteye.com/一、首先加入spring的依赖包,然后再加入quartz的包,如下:<dependenc...

Java面试必备!RabbitMQ 常用知识点总结,纯手绘23张图带你拿下

思维导航:基础为什么使用 MQ?MQ缺点几种 MQ 实现总结完整架构图RabbitMQ 六种工作模式1、Simple 简单模式2、work 工作模式3、publish/subscribe 发布订阅模式...