天天看點

spingBoot 定時任務

spingBoot 定時任務

第一種

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;

@Configuration      //1.主要用于标記配置類,兼備Component的效果。
@EnableScheduling   // 2.開啟定時任務
public class SaticScheduleTask {
    //3.添加定時任務
    @Scheduled(cron = "0/5 * * * * ?")
    private void configureTasks() {
        System.err.println("執行靜态定時任務時間: " + LocalDateTime.now());
    }
}
           

@Scheduled 配置

cron屬性

這是一個時間表達式,可以通過簡單的配置就能完成各種時間的配置,我們通過CRON表達式幾乎可以完成任意的時間搭配,它包含了六或七個域:

Seconds : 可出現", - * /“四個字元,有效範圍為0-59的整數

Minutes : 可出現”, - * /“四個字元,有效範圍為0-59的整數

Hours : 可出現”, - * /“四個字元,有效範圍為0-23的整數

DayofMonth : 可出現”, - * / ? L W C"八個字元,有效範圍為0-31的整數

Month : 可出現", - * /“四個字元,有效範圍為1-12的整數或JAN-DEc

DayofWeek : 可出現”, - * / ? L C #“四個字元,有效範圍為1-7的整數或SUN-SAT兩個範圍。1表示星期天,2表示星期一, 依次類推

Year : 可出現”, - * /"四個字元,有效範圍為1970-2099年

下面簡單舉幾個例子:

“0 0 12 * * ?” 每天中午十二點觸發

“0 15 10 ? * *” 每天早上10:15觸發

“0 15 10 * * ?” 每天早上10:15觸發

“0 15 10 * * ? *” 每天早上10:15觸發

“0 15 10 * * ? 2005” 2005年的每天早上10:15觸發

“0 * 14 * * ?” 每天從下午2點開始到2點59分每分鐘一次觸發

“0 0/5 14 * * ?” 每天從下午2點開始到2:55分結束每5分鐘一次觸發

“0 0/5 14,18 * * ?” 每天的下午2點至2:55和6點至6點55分兩個時間段内每5分鐘一次觸發

“0 0-5 14 * * ?” 每天14:00至14:05每分鐘一次觸發

“0 10,44 14 ? 3 WED” 三月的每周三的14:10和14:44觸發

“0 15 10 ? * MON-FRI” 每個周一、周二、周三、周四、周五的10:15觸發

fixedRate屬性

該屬性的含義是上一個調用開始後再次調用的延時(不用等待上一次調用完成),這樣就會存在重複執行的問題,是以不是建議使用,但資料量如果不大時在配置的間隔時間内可以執行完也是可以使用的。

fixedDelay屬性

該屬性的功效與上面的fixedRate則是相反的,配置了該屬性後會等到方法執行完成後延遲配置的時間再次執行該方法。

initialDelay屬性

該屬性跟上面的fixedDelay、fixedRate有着密切的關系,為什麼這麼說呢?該屬性的作用是第一次執行延遲時間,隻是做延遲的設定,并不會控制其他邏輯,是以要配合fixedDelay或者fixedRate來使用

第二種

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.time.LocalDateTime;

@Configuration      //1.主要用于标記配置類,兼備Component的效果。
@EnableScheduling   // 2.開啟定時任務
public class SaticScheduleTask implements SchedulingConfigurer {

    /**
     * 執行定時任務.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(
                //1.添加任務内容(Runnable)
                () -> System.out.println("執行動态定時任務: " + LocalDateTime.now().toLocalTime()),
                //2.設定執行周期(Trigger)
                triggerContext -> {
                    //2.3 傳回執行周期(Date)
                    return new CronTrigger("0/5 * * * * ?").nextExecutionTime(triggerContext);
                }
        );

    }

}