有時候在開發中常常會使用一些定時的任務,好比果整點推送,或者是每隔一段時間給客戶發送一個消息等等。這篇文章主要是經過Springboot整合Schedule來實現一個定時任務,很是的簡單。java
名稱 | 版本 |
---|---|
Idea | 2018專業版(已破解) |
Maven | 4.0.0 |
SpringBoot | 2.2.2 |
jdk | 1.8 |
idea以前發過一次破解碼,結果由於違規,文章被刪了,這是我羣裏的一個朋友分享的,親測可用,2018和2019版本的能夠永久破解,須要的能夠私信我。linux
因爲SpringBoot內置了定時任務Scheduled,可以很好的實現定時任務。git
一、添加定時任務註解github
1@SpringBootApplication
2//添加下面這個註解
3@EnableScheduling
4public class ScheduletaskApplication {
5 public static void main(String[] args) {
6 SpringApplication.run(ScheduletaskApplication.class, args);
7 }
8}
這個註解就好像是開關一下,啓動的時候一旦掃描到就標誌有定時任務存在。ide
二、新建task包,建立MyScheduledTask類idea
1@Component
2public class MyScheduledTask {
3 @Scheduled(cron = "5 0 0 * * ?")
4 public void scheduledTask1(){
5 System.out.println("定時任務1");
6 }
7
8 @Scheduled(initialDelay = 1000 * 10,fixedDelay = 1000 * 5)
9 public void scheduledTask2(){
10 System.out.println("任務2執行");
11 }
12 @Scheduled(initialDelay = 1000 * 10,fixedRate = 1000 * 5)
13 public void scheduledTask3(){
14 System.out.println("任務3執行時間:"+System.currentTimeMillis()%10000);
15 try {
16 Thread.sleep(2*1000);
17 } catch (InterruptedException e) {
18 e.printStackTrace();
19 }
20 System.out.println("任務3結束時間:"+System.currentTimeMillis()%10000);
21 }
22}
咱們接下來直接啓動項目便可就能夠看見定時任務的效果了。spa
OK,到了這一步算是基本上集成了定時任務,超級簡單,可是最主要的不是集成,而是定時任務的相關規則。code
在上面咱們建立了兩個方法,一個使用了cron,另一個使用了initialDelay和fixedDelay。不知道你是否理解。不理解也沒事,重點就是將他們的。事件
一、cronci
學過linux對它應該比較熟悉,沒學過那就先在先看看吧。Cron表達式是一個字符串,字符串以5或6個空格隔開,分爲6或7個域,每個域表明一個含義,Cron有以下兩種語法格式:
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
字段 | 容許值 | 容許的特殊字符 |
---|---|---|
秒(Seconds) | 0~59的整數 | , - * / 四個字符 |
分(Minutes) | 0~59的整數 | , - * / 四個字符 |
小時(Hours) | 0~23的整數 | , - * / 四個字符 |
日期(DayofMonth) | 1~31的整數 | ,- * ? / L W C 八個字符 |
月份(Month) | 1~12的整數或者 JAN-DEC | , - * / 四個字符 |
星期(DayofWeek) | 1~7的整數或者 SUN-SAT (1=SUN) | , - * ? / L C # 八個字符 |
年(可選,留空)(Year) | 1970~2099 | , - * / 四個字符 |
但還能夠出現以下特殊字符,它們的含義是:
(1)*:表示匹配該域的任意值。假如在Minutes域使用*, 即表示每分鐘都會觸發事件。
(2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,可是有種狀況例外。如寫法:13 13 15 20 * ?, 其中最後一位只能用?,而不能使用*,若是使用*表示無論星期幾都會觸發。
(3)-:表示範圍。例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次 。
(4)/:表示起始時間開始觸發,而後每隔固定時間觸發一次。例如在Minutes域使用5/20,則意味着5分鐘觸發一次,而25,45等分別觸發一次.
(5),:表示列出枚舉值。例如:在Minutes域使用5,20,則意味着在5和20分每分鐘觸發一次。
(6)L:表示最後,只能出如今DayofWeek和DayofMonth域。若是在DayofWeek域使用5L,意味着在最後的一個星期四觸發。
(7)W:表示有效工做日(週一到週五),只能出如今DayofMonth域,系統將在離指定日期的最近的有效工做日觸發事件。例如:在 DayofMonth使用5W,若是5日是星期六,則將在最近的工做日:星期五,即4日觸發。若是5日是星期天,則在6日(週一)觸發;若是5日在星期一到星期五中的一天,則就在5日觸發。另一點,W的最近尋找不會跨過月份 。
(8)LW:這兩個字符能夠連用,表示在某個月最後一個工做日,即最後一個星期五。
(9)#:用於肯定每月第幾個星期幾,只能出如今DayofMonth域。例如在4#2,表示某月的第二個星期三。
二、其餘參數
(1)initialDelay:啓動後多久開始執行,單位時毫秒
(2)fixedRate:下次執行時間,任務開始運行的時候就計時。
(3)fixedDelay:下次執行時間,fixedDelay等任務進行完了纔開始計時
第一種形式使用的比較多,通常表示循環使用,可是也要看本身實現什麼業務。定時任務實現起來很是的簡單。代碼已經上傳到了github。
https://github.com/fengdongdongwsn/MyjavaStudy.git