SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)

网友投稿 263 2022-10-13


SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)

SpringBoot 动态修改Scheduled

场景:

可配置的 Scheduled 执行时间,正常的 Scheduled 是在QCPujx项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间

例如:

系统启动 读取时间 Cron : 0 0 3 * * ? ,通过执行后台方法 可以动态配置 Cron 时间格式,并且清楚掉原本执行任务,执行新的设置定时任务时间

1、根据 ThreadPoolTaskScheduler 、ScheduledFuture 类 动态修改定时任务(ThreadPoolTaskScheduler 这个类 不能使用@Autowired ,直接定义成员变量 )

private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture> future;

2、动态修改 Scheduled 后台方法逻辑(object 是 Runnable 实现类 需要执行的定时逻辑,放到ruQCPujxn 线程方法内)

threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

threadPoolTaskScheduler.initialize();

if(future!=null){

future.cancel(true);

}

future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );

以上逻辑 ----------------------- 就可以实现 动态 Scheduled 配置

以下逻辑 ----------------------- 配置项目启动 自动读取 DB Cron 设置定时

1、@Order 并实现 CommandLineRunner 类 重写方法 run

@Override

public void run(String... args) throws Exception {

logger.info("系统启动 默认设置对账任务 时间");

//获取目前DB 设置的对账时间

GetBillTimeResp time = systemConfigService.getTime();

//获取Cron时间格式字符串

String timeCron = billTimeCronFormat(time.getBillTime());

logger.info("时间为:"+timeCron);

//Scheduler 设置每天执行。。。

threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

threadPoolTaskScheduler.initialize();

future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }

SpringBoot项目@Scheduled读取动态参数

1、基于@Scheduled可配置开发

application.propertites:

read.timer.parmas=0 0/1 * * * *

定时类:

@CompQCPujxonent

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) { QCPujx

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 * * * * *"


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:RTSP推拉流视频平台EasyNVR出现拉流不稳定现象的排查与解决
下一篇:EasyNVR服务里为什么会有两个easynvr程序?可以互相替换吗?(easynvr使用方法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~