目錄 定時任務管理器 定時任務的任務接口 定時任務和定時任務結果的緩存對象 定時任務 使用姿勢
定時任務管理器
負責啟動一個定時任務、停止一個定時任務、更新一個定時任務
public class ScheduleManager { private final Logger logger = LoggerFactory . getLogger ( ScheduleManager . class ) ; @Autowired private ThreadPoolTaskScheduler taskScheduler; private final Map < String , ScheduleTaskHolder > cache = new ConcurrentHashMap < > ( ) ; public ScheduleManager ( ThreadPoolTaskScheduler taskScheduler) { this . taskScheduler = taskScheduler; } public String startTask ( ScheduleTask scheduleTask, String cron) { ScheduledFuture < ? > scheduledFuture = taskScheduler. schedule ( scheduleTask, new CronTrigger ( cron) ) ; String key = UUID . randomUUID ( ) . toString ( ) ; ScheduleTaskHolder holder = new ScheduleTaskHolder ( scheduleTask, scheduledFuture) ; cache. put ( key, holder) ; logger. info ( "{} 定時任務啟動成功!唯一標識為:{}" , scheduleTask. getName ( ) , key) ; return key; } public void stopTask ( String key) { if ( StringUtils . isBlank ( key) ) { return ; } ScheduleTaskHolder holder = cache. get ( key) ; if ( Objects . isNull ( holder) ) { return ; } ScheduledFuture scheduledFuture = holder. getScheduledFuture ( ) ; boolean cancel = scheduledFuture. cancel ( true ) ; if ( cancel) { logger. info ( "{} 定時任務停止成功!唯一標識為:{}" , holder. getScheduleTask ( ) . getName ( ) , key) ; } else { logger. error ( "{} 定時任務停止失敗!唯一標識為:{}" , holder. getScheduleTask ( ) . getName ( ) , key) ; } } public String changeTask ( String key, String cron) { if ( StringUtils . isAnyBlank ( key, cron) ) { throw new RuntimeException ( "定時任務的唯一標識以及新的執行表達式不能為空" ) ; } ScheduleTaskHolder holder = cache. get ( key) ; if ( Objects . isNull ( holder) ) { throw new RuntimeException ( key + "唯一標識不存在" ) ; } stopTask ( key) ; return startTask ( holder. getScheduleTask ( ) , cron) ; } }
定時任務的任務接口
public interface ScheduleTask extends Runnable { String getName ( ) ; }
定時任務和定時任務結果的緩存對象
public class ScheduleTaskHolder implements Serializable { private ScheduleTask scheduleTask; private ScheduledFuture scheduledFuture; public ScheduleTaskHolder ( ) { } public ScheduleTaskHolder ( ScheduleTask scheduleTask, ScheduledFuture scheduledFuture) { this . scheduleTask = scheduleTask; this . scheduledFuture = scheduledFuture; } public ScheduleTask getScheduleTask ( ) { return scheduleTask; } public void setScheduleTask ( ScheduleTask scheduleTask) { this . scheduleTask = scheduleTask; } public ScheduledFuture getScheduledFuture ( ) { return scheduledFuture; } public void setScheduledFuture ( ScheduledFuture scheduledFuture) { this . scheduledFuture = scheduledFuture; }
}
定時任務
public class ThreadPoolWarnTask implements ScheduleTask { @Override public String getName ( ) { return "threadPoolWarnTask" ; } @Override public void run ( ) { }
}
使用姿勢
引入 ScheduleManager 對象 開啟定時任務、關閉定時任務、更新定時任務
String taskKey = scheduleManager. startTask ( threadPoolWarnTask, CRON ) ;
scheduleManager. stopTask ( taskKey) ;
scheduleManager. changeTask ( taskKey, newCRON) ;