好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

SpringBoot 动态修改Scheduled

场景:

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

例如:

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

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

?

1

2

private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture<?> future;

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

?

1

2

3

4

5

6

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

?

1

2

3

4

5

6

7

8

9

10

11

12

@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可配置开发

?

1

2

application.propertites:

read.timer.parmas= 0 0 / 1 * * * *

定时类:

?

1

2

3

4

5

6

7

8

@Component

public class ScheduledService {

Logger logger= LoggerFactory.getLogger(ScheduledService. class );

     @Scheduled (cron = "${read.timer.parmas}" )

     public void readConfigTable(){

         logger.info( "*****.read.timer.parmas" );

     }

}

启动类:

?

1

2

3

4

5

6

7

@SpringBootApplication

@EnableScheduling   //必须

public class DataApplication {

   public static void main(String[] args) {

         SpringApplication.run(DataApplication. class ,args);

     }

}

2、基于代码实现

(1)核心代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

@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)其他类或方法动态传参赋值

?

1

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://HdhCmsTestcnblogs测试数据/yi1036943655/p/11511676.html

查看更多关于SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)的详细内容...

  阅读:27次