好得很程序员自学网

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

SpringBoot项目中使用@Scheduled读取动态参数

使用@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

27

28

29

@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 * * * * *"

spring boot Scheduled动态配置

?

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

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

package cn.com.suntree.cmp.service;

import cn.com.suntree.cmp.utils.CommonUtil;

import lombok.extern.log4j.Log4j2;

import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

import org.springframework.scheduling.annotation.SchedulingConfigurer;

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import org.springframework.scheduling.support.CronTrigger;

import org.springframework.stereotype.Component;

import redis.clients.jedis.Jedis;

import java.util.Date;

@Component

@Log4j2

public class MyDynamicTask implements SchedulingConfigurer { //实现SchedulingConfigurer 接口

     @Autowired

     CommonUtil commonUtil;

     @Autowired

     TaskService taskService;

     private static String cron;

     @Override

     public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { //重写该方法

         scheduledTaskRegistrar.addTriggerTask(doTask(), getTrigger());

     }

     private Runnable doTask() {

         return new Runnable() {

             @Override

             public void run() {

                 log.info( "-------------------------------执行" +cron);

                 taskService.monDay(); //真正需要运行的逻辑代码

             }

         };

     }

     private Trigger getTrigger() {

         return new Trigger() {

             @Override

             public Date nextExecutionTime(TriggerContext triggerContext) {

                 // 触发器

                 CronTrigger trigger = new CronTrigger(getCron());

                 return trigger.nextExecutionTime(triggerContext);

             }

         };

     }

     public String getCron() {

         Jedis jedis = commonUtil.getJedis();

         String newCron =  jedis.get( "cron" ); //可以改成配置到数据库中

         if (StringUtils.isEmpty(newCron)) {

             jedis.set( "cron" , "0 30 0 ? * Mon" );

             return "0 30 0 ? * Mon" ;

         }

         if (!newCron.equals(cron)) {

             log.info( new StringBuffer( "Cron has been changed to:'" ).append(newCron).append( "'. Old cron was:'" ).append(cron).append( "'" ).toString());

             cron = newCron;

         }

         return cron;

     }

}

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

原文链接:https://blog.csdn.net/hyj_king/article/details/98874541

查看更多关于SpringBoot项目中使用@Scheduled读取动态参数的详细内容...

  阅读:28次