Spring的@Scheduled 动态更新cron表达式

2024-03-29 14:52

本文主要是介绍Spring的@Scheduled 动态更新cron表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们主要讲解它的动态配置使用方法。

在刚开始使用的时候,我们更改一个任务的执行时间,一般是这样的:修改定时任务的执行周期,把服务停下来,改下任务的cron参数,再重启服务就搞搞定了。这种方式很简单,没有可说的,但是有没有一种可能,在不停服务的情况下,就可以动态的修改任务的cron参数呢?那是必须有!

刚刚提到的方法里,我们在主类上面加@EnableScheduling注解,在任务方法前面加上@Scheduled(cron ="*/5 * * * * ?")注解定义执行时间,但是动态配置的步骤就有点不一样:

1. 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。

2. 设置一个静态的cron,用于存放任务执行周期参数。

3. 从数据库获取Cron参数,用于模拟实际业务中外部原因修改了任务执行周期。

4. 设置任务触发器,触发任务执行。

常见的本地定时写法如下:

	@Scheduled(cron = "0/5 * * * * ?")private void test() {log.info("业务处理逻辑。。。5秒一次");}

如果想要动态更新cron表达式,实现SchedulingConfigurer接口,可以这样写: 

@Component
@EnableScheduling
public class SpringDynamicCornTask implements SchedulingConfigurer {private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCornTask.class);@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {//项目部署时,会在这里执行一次,从数据库拿到cron表达式String cron = "*/60 * * * * ?";taskRegistrar.addTriggerTask(() -> {logger.info("真正的任务执行逻辑。。。");}, triggerContext -> {CronTrigger trigger = new CronTrigger(cron);return trigger.nextExecutionTime(triggerContext);});}
}

 完整代码可以这样实现

import java.util.Date;import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;@Component
@EnableScheduling
public class TaskCronChange implements  SchedulingConfigurer{public static String cron;@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {//项目部署时,会在这里执行一次,从数据库拿到cron表达式cron = timerQueryMapper.getCronTime();Runnable task = new Runnable() {@Overridepublic void run() {//任务逻辑代码部分.System.out.println("I am going:" + LocalDateTime.now());}};Trigger trigger = new Trigger() {@Overridepublic Date nextExecutionTime(TriggerContext triggerContext) {//任务触发,可修改任务的执行周期.//每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间       cron = timerQueryMapper.getCronTime();CronTrigger trigger = new CronTrigger(cron);Date nextExec = trigger.nextExecutionTime(triggerContext);return nextExec;}};taskRegistrar.addTriggerTask(task, trigger);}}

因为是要任务执行一次的时候才会去修改时间的cron表达式,所以改了cron后,要在下下次任务执行时才会生效。
这里核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期。

这篇关于Spring的@Scheduled 动态更新cron表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858884

相关文章

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Spring MVC跨域问题及解决

《SpringMVC跨域问题及解决》:本文主要介绍SpringMVC跨域问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录跨域问题不同的域同源策略解决方法1.CORS2.jsONP3.局部解决方案4.全局解决方法总结跨域问题不同的域协议、域名、端口

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进