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