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;
}
}