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