Springboot實現定時任務

     

有時候在開發中常常會使用一些定時的任務,好比果整點推送,或者是每隔一段時間給客戶發送一個消息等等。這篇文章主要是經過Springboot整合Schedule來實現一個定時任務,很是的簡單。java

1、開發環境

名稱 版本
Idea 2018專業版(已破解)
Maven 4.0.0
SpringBoot 2.2.2
jdk 1.8

idea以前發過一次破解碼,結果由於違規,文章被刪了,這是我羣裏的一個朋友分享的,親測可用,2018和2019版本的能夠永久破解,須要的能夠私信我。linux

2、整合開發

因爲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

3、定時參數

在上面咱們建立了兩個方法,一個使用了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

相關文章
相關標籤/搜索