Using @ Scheduled to read dynamic parameters in SpringBoot project
- 2021-12-05 06:24:17
- OfStack
Directory uses @ Scheduled to read dynamic parameters 1, configurable development based on @ Scheduled 2, and dynamic configuration of spring boot Scheduled based on code
Using @ Scheduled to read dynamic parameters
1. Configurable development based on @ Scheduled
application.propertites :
read.timer.parmas=0 0/1 * * * *
Timing class:
@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
@Scheduled(cron = "${read.timer.parmas}")
public void readConfigTable(){
logger.info("*****.read.timer.parmas");
}
}
Startup class:
@SpringBootApplication
@EnableScheduling // Must
public class DataApplication {
public static void main(String[] args) {
SpringApplication.run(DataApplication.class,args);
}
}
2. Implementation based on code
(1) Core code
@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);
public static String DEFAULT_CORN="0/3 * * * * *";
//## Dynamic parameters should be passed to default values.
public static String corn=DEFAULT_CORN;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
// logger.info(" Timed task logic ");
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// Task triggering, which can modify the execution cycle of a task
CronTrigger cronTrigger = new CronTrigger(corn);
Date date = cronTrigger.nextExecutionTime(triggerContext);
return date;
}
});
}
}
(2) Dynamic parameter transfer and assignment of other classes or methods
TestScheduledParams.corn="0/20 * * * * *"
spring boot Scheduled Dynamic Configuration
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 {// Realization SchedulingConfigurer Interface
@Autowired
CommonUtil commonUtil;
@Autowired
TaskService taskService;
private static String cron;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {// Override this method
scheduledTaskRegistrar.addTriggerTask(doTask(), getTrigger());
}
private Runnable doTask() {
return new Runnable() {
@Override
public void run() {
log.info("------------------------------- Execute "+cron);
taskService.monDay();// Logical code that really needs to run
}
};
}
private Trigger getTrigger() {
return new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// Trigger
CronTrigger trigger = new CronTrigger(getCron());
return trigger.nextExecutionTime(triggerContext);
}
};
}
public String getCron() {
Jedis jedis = commonUtil.getJedis();
String newCron = jedis.get("cron");// You can configure it to the database instead
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;
}
}