Spring定時任務

1. 實現方式

Spring實現定時任務有兩種方式:註解方式、 XML配置方式

1) 方式一: 註解方式

配置

    <!-- 包路徑掃描 -->
    <context:component-scan base-package="spring.task"/>

    <!-- 定義線程池 -->
    <task:executor id="taskExecutor" pool-size="20" queue-capacity="100" rejection-policy="DISCARD_OLDEST"/>
     <!--定義定時任務 -->
    <task:scheduler id="threadPoolTaskScheduler" pool-size="10" />

    <!-- 定時器開關,實際上只需要下方的一行,其中屬性均可不要 --> 
    <task:annotation-driven  executor="taskExecutor" scheduler="threadPoolTaskScheduler"/>

測試代碼

在需要定時執行的方法上加上@Scheduled註解,並配上定時規則:

@Service
public class ScheduleTask {
    private static int i=0;
    /**
     * 通過cron方式配置定時
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void loopTaskCron(){
        System.out.println("loopTaskCron-------" + new Date() + "-------" + (i++) + "-------");
    }

    /**
     * 默認毫秒級別,定期執行任務
     */
    @Scheduled(fixedRate = 5 * 1000L)
    public void loopTaskFixRate(){
        System.out.println("loopTaskCronFixRate-------" + new Date() + "-------" + (i++) + "-------");
    }
    /**
     * 默認毫秒級別延遲執行任務
     */
    @Scheduled(fixedDelay = 5 * 1000L)
    public void loopTaskFixDelay(){
        System.out.println("fixedDelay-------" + new Date() + "-------" + (i++) + "-------");
    }

}

2)方式二:XML配置

配置

    <!-- 基於配置文件形式 -->
    <bean id="myTask" class="spring.task.ScheduleTask"></bean>
    <task:scheduled-tasks>
        <!--這裏表示的是每隔五秒執行一次  -->
        <task:scheduled ref="myTask" method="loopTaskCron" cron="*/5 * * * * ?" />
        <task:scheduled ref="myTask" method="loopTaskFixRate" fixed-rate="5000" />
        <task:scheduled ref="myTask" method="loopTaskFixRateString" fixed-delay="5000" />
    </task:scheduled-tasks>

測試代碼

public class ScheduleTask {
    private static int i=0;

    /**
     * 通過cron方式配置定時
     */
    public void loopTaskCron(){
        System.out.println("loopTaskCron-------" + new Date() + "-------" + (i++) + "-------");
    }

    /**
     * 默認毫秒級別,定期執行任務
     */
    public void loopTaskFixRate(){
        System.out.println("loopTaskFixRate-------" + new Date() + "-------" + (i++) + "-------");
    }

    /**
     * 默認毫秒級別,延遲執行任務
     */
    public void loopTaskFixDelay(){
        System.out.println("fixedDelay-------" + new Date() + "-------" + (i++) + "-------");
    }

}

2. 定時規則

Spring支持以下幾種定時設置:

  • cron : 按照cron定義方式執行任務;
  • fixRate(fixRateString) : 按固定時間間隔執行任務,默認單位是毫秒,fixRateString支持字符串類型參數
  • fixDelay(fixedDelayString):按一定延遲執行任務,默認單位是毫秒,fixedDelayString支持字符串類型參數

3. cron定時配置

Spring支持的cron表達式由6個 由空格分隔的時間元素,按順序依次爲:

  • 秒 (0~59)
  • 分鐘(0~59)
  • 小時(0~23)
  • 天(對應所在月的天數,0~31)
  • 月(0~11)
  • 天(星期, 1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)

其中每個元素可以是:

  • 一個值(如6)
  • 一個連續區間(9-12)
  • 一個間隔時間(8-18/4)(/表示每隔4小時)
  • 一個列表(1,3,5)
  • 通配符 “*”,表示所有可能的值
    注:由於”月份中的日期”和”星期中的日期”這兩個元素互斥的,必須要對其中一個設置爲”?”.

支持的特殊字符包括:

  • “*” 表示所有可能的值
  • “/” 字符用來指定數值的增量,如 分鐘 裏的“0/15”表示從第0分鐘開始,每15分鐘
  • “?” 字符僅被用於天(月)和天(星期)兩個子表達式,表示不指定值
  • “L” 字符僅被用於天(月)和天(星期)兩個子表達式, 是“Last”的縮寫, “6L”表示這個月的倒數第6天,“FRIL”表示這個月的最一個星期五
    注:“L”不要與指定列表或範圍一起使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章