SpringBoot项目中使用@Scheduled读取动态参数

目录

  • 使用@Scheduled读取动态参数
    • 1、基于@Scheduled可配置开发
    • 2、基于代码实现
  • spring boot Scheduled动态配置

    使用@Scheduled读取动态参数
    1、基于@Scheduled可配置开发
    application.propertites: read.timer.parmas=0 0/1 * * * *

    定时类:
    @Componentpublic 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@EnableSchedulingpublic class TestScheduledParams implements SchedulingConfigurer{Logger logger= LoggerFactory.getLogger(TestScheduledParams.class); public staticString DEFAULT_CORN="0/3 * * * * *"; //##动态传参要给默认值。public static String corn=DEFAULT_CORN; @Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(new Runnable() {@Overridepublic void run() {// logger.info("定时任务逻辑"); }}, new Trigger() {@Overridepublic 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@Log4j2public class MyDynamicTask implements SchedulingConfigurer {//实现SchedulingConfigurer 接口@AutowiredCommonUtil commonUtil; @AutowiredTaskService taskService; private static String cron; @Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {//重写该方法scheduledTaskRegistrar.addTriggerTask(doTask(), getTrigger()); }private Runnable doTask() {return new Runnable() {@Overridepublic void run() {log.info("-------------------------------执行"+cron); taskService.monDay(); //真正需要运行的逻辑代码}}; }private Trigger getTrigger() {return new Trigger() {@Overridepublic 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; }}

    【SpringBoot项目中使用@Scheduled读取动态参数】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

      推荐阅读