1. 程式人生 > >SpringBoot使用@Scheduled建立定時任務

SpringBoot使用@Scheduled建立定時任務

1、SpringBoot中內建了@Scheduled的定時任務,首先配置這個註解,我還是基於此前建立的demo01專案,找到專案的入口方法Demo01Application添加註解@EnableScheduling

2、新建一個class檔案,添加註解@Component,表明該class會被例項化為Spring bean,被Spring管理。

(1)fixedRate屬性:

該屬性的含義是上一個該方法呼叫開始後再次呼叫的間隔時間,沒有等待上一次方法呼叫完成,

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * 通過控制檯列印資訊可得出結論:該方法並不會等待該方法已經執行完成,會一直間隔2秒重複呼叫
     * */
    @Scheduled(fixedRate = 1000)//配置的間隔時間是1秒
    public void fixedRate() throws Exception{
        System.out.println("current time0: " + dateFormat.format(new Date()));
        Thread.sleep(2000);//休眠2秒
        System.out.println("current time1: " + dateFormat.format(new Date()));
    }
}

(2)fixedDelay屬性

該屬性與上面的fixedRate屬性則是相反的,含義為等到該方法執行完成後(延遲配置的時間)再次執行該方法。

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * 通過控制檯列印資訊可得出結論:該方法會等待該方法執行完成,間隔1秒再次呼叫
     * */
    @Scheduled(fixedDelay=1000)
    public void fixedDelay() throws Exception{
        Thread.sleep(5000);//休眠5秒
        System.out.println("current time2: " + dateFormat.format(new Date()));
    }
}

(3)initialDelay屬性

該屬性的作用是第一次執行該方法前的延遲時間,而後再執行該方法不再影響

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");


    /**
     * 通過控制檯列印資訊可得出結論:第一次呼叫前延遲10秒,而後間隔1秒並等待該方法執行完成再次呼叫
     * */
    @Scheduled(initialDelay=10000,fixedDelay=1000)
    public void initialDelay() throws Exception{
        System.out.println("current time2: " + dateFormat.format(new Date()));
    }
}

4、cron屬性

這是一個時間表達式,通過簡單的表示式就能完成實際工作中各種時間的配置

Cron表示式是一個字串,字串以5或6個空格隔開,分開工6或7個域,每一個域代表一個含義,Cron有如下兩種語法  格式:  Seconds Minutes Hours DayofMonth Month DayofWeek Year 或  Seconds Minutes Hours DayofMonth Month DayofWeek 

{秒} {分} {時} {日} {月} {周} {年(可選)}

表示式舉例:

"0 0 12 * * ?" 每天中午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期間的每1分鐘觸發

"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發

"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發

"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發

"0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發

"0 15 10 15 * ?" 每月15日上午10:15觸發

"0 15 10 L * ?" 每月最後一日的上午10:15觸發

"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發

"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發

"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron = "*/20 * * * * ?")//每20秒執行一次
    public void cronCurrentTime() {
        System.out.println("current time3: " + dateFormat.format(new Date()));
    }

}