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()));
}
}