Springboot動態定時任務
阿新 • • 發佈:2018-12-30
1、動態定時任務
重點在於Trigger。採用Cron格式設定時間,時間存在redis中。比如key為crontime,value設定為10分鐘,
即crontime = "0 0/10 * * * ? "。在redis中人為修改時間,任務會在下個定時週期生效,不必重新啟動程式。
package com.exm.springmybatis.scheduler.task; import com.exm.springmybatis.service.RedisServer; import lombok.extern.slf4j.Slf4j; 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 org.springframework.util.StringUtils; import java.util.Date; /** * 重點在Trigger * Created by on xiabaobao 2018/11/19 16:40 */ @Slf4j @Component public class DynamicTask implements SchedulingConfigurer { @Autowired private RedisServer redisServer; 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("**** mytask first to run: {}",new Date(System.currentTimeMillis())); } }; } private Trigger getTrigger(){ return new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { CronTrigger trigger = new CronTrigger(gerCron()); return trigger.nextExecutionTime(triggerContext); } }; } public String gerCron(){ String newCron = redisServer.get("crontime"); log.info("*** get time: {} ",newCron); if(StringUtils.isEmpty(newCron)){ log.info(" get cron time fail"); }else if(!newCron.equals(cron)){ log.info("newCrontime: {} <-> oldCrontime: {}", newCron, cron); cron = newCron; } return cron; } }