使用@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读取动态参数的详细内容...