Spring4.0編程式定時任務配置


看過很多定時調度的配置,大多使用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
    }
}

@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注,我們可以理解為將這個類交給spring管理,相當於一個java bean,名字叫user.task

到此為止我們就可以通過@Scheduled注解使用corn表達式實現任務調度了。

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)

常用符號代表意思:

  1. * 字符代表所有可能的值。因此,* 在子表達式(月)里表示每個月的含義,* 在子表達式(天(星期))表示星期的每一天
  2. ?字符僅被用於天(月)和天(星期)兩個子表達式,表示不指定值當2個子表達式其中之一被指定了值以后,為了避免沖突,需要將另一個子表達式的值設為“?”
  3. / 字符表示起始時間開始觸發,然后每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味着5分鍾觸發一次

幾個示例:

  1. 每天的凌晨4點 @Scheduled(cron = "0 0 4 * * *")
  2. 每周日的凌晨5點  @Scheduled(cron = "0 0 5 * * SUN")
  3. 每月第一天凌晨2點10分 @Scheduled(cron="0 10 02 01 * ?")
  4. 每天從下午2點開始到2點55分結束每隔5分鍾觸發一次 @Schedule(cron = "0 0/5 14 * * ?")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM