SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)

作者:Architect剑 时间:2023-11-29 06:13:27 

SpringBoot 动态修改Scheduled

场景:

可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间

例如:

系统启动 读取时间 Cron : 0 0 3 * * ? ,通过执行后台方法 可以动态配置 Cron 时间格式,并且清楚掉原本执行任务,执行新的设置定时任务时间

1、根据 ThreadPoolTaskScheduler 、ScheduledFuture 类 动态修改定时任务(ThreadPoolTaskScheduler 这个类 不能使用@Autowired ,直接定义成员变量 )


private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;

2、动态修改 Scheduled 后台方法逻辑(object 是 Runnable 实现类 需要执行的定时逻辑,放到run 线程方法内)


threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
if(future!=null){
   future.cancel(true);
}
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );

以上逻辑 ----------------------- 就可以实现 动态 Scheduled 配置

以下逻辑 ----------------------- 配置项目启动 自动读取 DB Cron 设置定时

1、@Order 并实现 CommandLineRunner 类 重写方法 run


   @Override
   public void run(String... args) throws Exception {
       logger.info("系统启动 默认设置对账任务 时间");
       //获取目前DB 设置的对账时间
       GetBillTimeResp time = systemConfigService.getTime();
       //获取Cron时间格式字符串
       String timeCron = billTimeCronFormat(time.getBillTime());
       logger.info("时间为:"+timeCron);
       //Scheduler 设置每天执行。。。
       threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
       threadPoolTaskScheduler.initialize();
       future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }

SpringBoot项目@Scheduled读取动态参数

1、基于@Scheduled可配置开发


application.propertites:
read.timer.parmas=0 0/1 * * * *

定时类:


@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
   @Scheduled(cron = "${read.timer.parmas}")
   public void readConfigTable(){
       logger.info("*****.read.timer.parmas");
   }
}

启动类:


@SpringBootApplication
@EnableScheduling  //必须
public class DataApplication {
 public static void main(String[] args) {
       SpringApplication.run(DataApplication.class,args);
   }
}

2、基于代码实现

(1)核心代码


@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
   Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);

public static  String DEFAULT_CORN="0/3 * * * * *";
   //##动态传参要给默认值。
   public static String corn=DEFAULT_CORN;
   @Override
   public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {    
       taskRegistrar.addTriggerTask(new Runnable() {
           @Override
           public void run() {
              // logger.info("定时任务逻辑");
           }
       }, new Trigger() {
           @Override
           public Date nextExecutionTime(TriggerContext triggerContext) {
               //任务触发,可修改任务的执行周期
               CronTrigger cronTrigger = new CronTrigger(corn);
               Date date = cronTrigger.nextExecutionTime(triggerContext);
               return date;
           }
       });
   }
}

(2)其他类或方法动态传参赋值


TestScheduledParams.corn="0/20 * * * * *"

来源:https://www.cnblogs.com/yi1036943655/p/11511676.html

标签:SpringBoot,Scheduled
0
投稿

猜你喜欢

  • Android实现五子棋游戏(局域网版)

    2023-04-08 08:17:20
  • 详解Spring中bean的几种注入方式

    2023-02-12 20:25:07
  • Windows 10卸载JDK1.8超详细图文教程

    2022-07-07 22:30:16
  • 详解Java图形化编程中的鼠标事件设计

    2022-07-11 08:11:31
  • C#提取PPT文本和图片的实现方法

    2022-10-28 08:02:59
  • Java常见问题之javac Hello.java找不到文件的解决方法

    2023-12-15 21:19:45
  • Mybatis逆工程jar包的修改和打包

    2023-06-03 09:28:14
  • java设计模式学习之工厂方法模式

    2023-10-12 17:19:04
  • Spring Cloud Feign接口返回流的实现

    2021-06-07 07:21:54
  • java之使用多线程代替for循环(解决主线程提前结束问题)

    2021-11-21 01:23:55
  • Android编程开发中ListView的常见用法分析

    2022-04-15 09:52:07
  • Java Runnable和Thread实现多线程哪个更好你知道吗

    2021-08-17 05:48:50
  • java实现在线聊天系统

    2021-07-30 08:20:54
  • 旧项目升级新版Unity2021导致Visual Studio无法使用的问题

    2023-12-28 21:51:26
  • Java源码解析之ClassLoader

    2022-06-14 06:07:47
  • Java对象的内存布局详细介绍

    2021-07-28 05:11:38
  • react native打包apk文件安装好之后进入应用闪退的解决方案

    2022-11-04 06:13:09
  • C#使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化

    2023-01-16 02:11:54
  • Android游戏开发学习①弹跳小球实现方法

    2022-04-27 02:48:14
  • Android启动屏实现左右滑动切换查看功能

    2022-11-02 02:18:02
  • asp之家 软件编程 m.aspxhome.com