需求:同一個定時任務,可能會在不同的時間去執行,人工可以配置
@Component
public class TimerTaskDynamicCron implements InitializingBean {
private static Logger logger = LoggerFactory.getLogger(TimerTaskDynamicCron.class);
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
private RobotTimeTaskDao robotTimeTaskDao;
private List<ScheduledFuture<?>> robotFutureList=new CopyOnWriteArrayList<ScheduledFuture<?>>();
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
/**
* 項目啓動時就運行的
或者用 @PostConstruct 這個標籤
*/
@Override
public void afterPropertiesSet() throws Exception {
List<RobotTimeTask> tasks = robotTimeTaskDao.findAll();
for(RobotTimeTask task:tasks){
startRobotTask(task);
}
}
/**
* 開啓定時任務
* @param task
*/
public void startRobotTask(RobotTimeTask task) {
ScheduledFuture future = threadPoolTaskScheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println("num::::::::"+task.getNum());
logger.info("Task...........run..{}",task.getNum());
}
},new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext){
//0/30 * * * * ?
CronTrigger trigger = new CronTrigger(task.getCron());
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
});
robotFutureList.add(future);
}
/**
* 停止定時任務
*/
public void stopRobotTask() {
for(ScheduledFuture future:robotFutureList){
if (future != null) {
//不會馬上停止任務,會等任務執行完 只是執行了interrupt方法
future.cancel(true);
}
}
robotFutureList.clear();
logger.info("DynamicTask.stopTask()");
}
}
模擬用戶從前臺修改定時:
@Service
public class TimerTaskDynamicService {
@Autowired
private TimerTaskDynamicCron timerTaskDynamicCron;
public void stopTask(){
//先停止現有的定時
timerTaskDynamicCron.stopRobotTask();
//模擬新改的定時
List<RobotTimeTask> tasks=new ArrayList<RobotTimeTask>();
RobotTimeTask task1=new RobotTimeTask();
task1.setCron("0/5 * * * * ?");
task1.setNum(1);
RobotTimeTask task2=new RobotTimeTask();
task2.setCron("0/10 * * * * ?");
task2.setNum(2);
RobotTimeTask task3=new RobotTimeTask();
task3.setCron("0/15 * * * * ?");
task3.setNum(3);
tasks.add(task1);tasks.add(task2);tasks.add(task3);
for(RobotTimeTask task:tasks){
timerTaskDynamicCron.startRobotTask(task);
}
//把舊的定時從數據庫刪除
//再把新的task儲存到數據庫 以便下次啓動時 執行到最新的任務
}
}