SpringBoot项⽬中使⽤@Scheduled读取动态参数
⽬录
使⽤@Scheduled读取动态参数
1、基于@Scheduled可配置开发2、基于代码实现spring boot Scheduled动态配置使⽤@Scheduled读取动态参数
1、基于@Scheduled可配置开发
application.propertites:
read.timer.parmas=0 0/1 * * * *
定时类:
@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class); @Scheduled(cron = \"${read.timer.parmas}\") public void readConfigTable(){
logger.info(\"*****.read.timer.parmas\"); }}
启动类:
@SpringBootApplication@EnableScheduling //必须public class DataApplication {
public static void main(String[] args) {
SpringApplication.run(DataApplication.class,args); }}
2、基于代码实现
(1)核⼼代码
@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)其他类或⽅法动态传参赋值
TestScheduledParams.corn=\"0/20 * * * * *\"
spring boot Scheduled动态配置
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\ 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; }}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。