spring|基于springboot修改定时任务的参数

基于springboot的定时任务的使用,比较简单,这里简单说一下,第一步是在启动类里面开启@EnableScheduling定时任务注解;第二步是定义一个bean,在bean里面的方法上使用定时任务的注解,比如:
@Scheduled(fixedDelay = 5000),@Scheduled(fixedRate = 5000) ,@Scheduled(initialDelay = 1000, fixedRate = 5000) ,@Scheduled(cron = "0 0/1 * * * ?") 这些注解,放置到方法上面。

不过上面的注解定义的定时任务都是静态的,也就是定时任务的时间的静态的固定的,有时候我们需要修改定时任务的时间怎么办了?看下面的例子:
实现SchedulingConfigurer接口:

package com.qwrt.fire.sensor.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by jack on 2018/3/22. */ @Component public class MyScheduledTaskTest implements SchedulingConfigurer { private static final Logger logger = LoggerFactory.getLogger(MyScheduledTaskTest.class); private static int fixedDelayCount = 0; private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static final String DEFAULT_CRON = "0/5 * * * * ?"; private String cron = DEFAULT_CRON; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(() -> { //定时业务处理 if (!cron.equals(DEFAULT_CRON)) { System.out.println("定时参数修改了: "+fixedDelayCount++); } // 定时任务的业务逻辑 logger.info("动态修改定时任务cron参数,当前时间:" + dateFormat.format(new Date())); }, triggerContext -> { // 定时任务触发,可修改定时任务的执行周期 CronTrigger trigger = new CronTrigger(cron); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; }); }public String getCron() { return cron; }public void setCron(String cron) { this.cron = cron; } }


编写一个测试的控制器,动态修改定时任务的参数:
package com.qwrt.fire.sensor.task; import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by jack on 2018/3/22. */ @RestController @RequestMapping("test/modifyScheduledParamTest") public class ModifyScheduledParamTest { @Autowired private MyScheduledTaskTest myScheduledTaskTest; @RequestMapping(value = "https://www.it610.com/updateCron") public JSONObject updateCron(){System.out.println("进行定时参数修改......"); String cron = "0/10 * * * * ?"; myScheduledTaskTest.setCron(cron); JSONObject jsonObject = new JSONObject(); jsonObject.put("success", "修改定时参数成功"); return jsonObject; } }


核心代码就是上面两个类,启动程序,刚开始是每隔5秒打印一次,修改了参数以后,每隔10秒打印一次,实现了动态修改参数的功能。当然你可以定义参数传入controller中,这样你就可以灵活的设置定时任务的参数了。这在实际应用中有很大的帮助,能解决我们实际的一些需求。
欢迎加群:331227121学习交流




【spring|基于springboot修改定时任务的参数】

    推荐阅读