看過很多定時調度的配置,大多使用XML配置,覺得比較麻煩,也比較老套。這里介紹一種基於spring4.0注解編程式配置定時任務,簡單清晰,使用方便..
至於引入spring相關jar這里不多說,直接切入正題貼上代碼:
@Configuration @EnableScheduling public class WebAppConfig implements SchedulingConfigurer { //TaskScheduler configuration @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { logger.info("Configure task registor: {}", taskRegistrar); taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod="shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(4); } }
思路:
我們通常將用於存放配置信息類的類名以 “Config” 結尾,如上我們在WebAppConfig里通過 @Configuration注解,指出該類是Bean配置的信息源,再通過@EnableScheduling開啟定時調度,一般情況下實際項目中都是多線程執行定時任務的,所以我們可以通過實現SchedulingConfigurar接口,訪問底層的ScheduledRegistrar實例,產生一個Executer對象,然后根據系統的承受能力調整線程池中工作線程的數目,這里我啟了4個線程。注意上面使用的@bean(destroyMethod="shutdown")是為了確保當Spring應用上下文關閉的時候任務執行者也被正確地關閉。
使用:
@Component("user.task") public class userTaskJob { /** * 每月第一天凌晨一點執行 */ @Scheduled(cron="0 0 01 01 * ?") public void tempUserTaskDelete() { //do something } }
cron表達式簡要介紹:
一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。依次順序為:
- 秒(0~59)
- 分鍾(0~59)
- 小時(0~23)
- 天(月)(0~31,需要考慮月的天數)
- 月(0~11)
- 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
- 年份(1970-2099)
常用符號代表意思:
- * 字符代表所有可能的值。因此,* 在子表達式(月)里表示每個月的含義,* 在子表達式(天(星期))表示星期的每一天
- ?字符僅被用於天(月)和天(星期)兩個子表達式,表示不指定值當2個子表達式其中之一被指定了值以后,為了避免沖突,需要將另一個子表達式的值設為“?”
- / 字符表示起始時間開始觸發,然后每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味着5分鍾觸發一次
幾個示例:
- 每天的凌晨4點 @Scheduled(cron = "0 0 4 * * *")
- 每周日的凌晨5點 @Scheduled(cron = "0 0 5 * * SUN")
- 每月第一天凌晨2點10分 @Scheduled(cron="0 10 02 01 * ?")
- 每天從下午2點開始到2點55分結束每隔5分鍾觸發一次 @Schedule(cron = "0 0/5 14 * * ?")