SpringBoot定時任務

2021-10-01 19:29:49 字數 4121 閱讀 5724

首先需要在啟動類中加上@enablescheduling註解來開啟定時任務。

接配置完後就可以使用定時任務了,注意要加上@componet註解載入到spirng容器中例子如下:
@component

public class dingshi ");

responsetest res = new responsetest()

; system.out.

println

(system.

currenttimemillis()

+"開始執行");

responseentity responsetestresponseentity = resttemplate.

postforentity

("", ent, responsetest.class)

; system.out.

println

(responsetestresponseentity.

getbody()

.getjobid()

);}}

執行結果如圖:

上面的定時任務時每30秒鐘執行一次邏輯**,在spring中		@scheduled有三種定時任務的執行方式。
1.fixeddelay:指定兩次任務執行的時間間隔(毫秒),此時間間隔指的是,前一次任務結束與下乙個任務開始的間隔。如:@scheduled(fixeddelay = 5*1000 ),表示第乙個任務結束後,過5秒後,開始第二個任務。

2.fixedrate:指定兩次任務執行的時間間隔(毫秒),此時間間隔指的是,前乙個任務開始與下乙個任務開始的間隔。如:@scheduled(fixedrate= 5*1000 ),表示第乙個任務開始後(第乙個任務執行時間小於5秒),第乙個任務開始後的第6秒,開始第二個任務。如果第乙個任務執行時間大於5秒,第乙個任務結束後,直接開始第二個任務。

fixeddelay與fixedrate差別可以檢視圖例區別:

fixeddelay非常好理解,它的間隔時間是根據上次的任務結束的時候開始計時的。比如乙個方法上設定了fixeddelay=5*1000,那麼當該方法某一次執行結束後,開始計算時間,當時間達到5秒,就開始再次執行該方法。

fixedrate理解起來比較麻煩,它的間隔時間是根據上次任務開始的時候計時的。比如當方法上設定了fiexdrate=5*1000,該執行該方法所花的時間是2秒,那麼3秒後就會再次執行該方法。

但是這裡有個坑,當任務執行時長超過設定的間隔時長,那會是什麼結果呢。打個比方,比如乙個任務本來只需要花2秒就能執行完成,我所設定的fixedrate=5*1000,但是因為網路問題導致這個任務花了7秒才執行完成。當任務開始時spring就會給這個任務計時,5秒鐘時候spring就會再次呼叫這個任務,可是發現原來的任務還在執行,這個時候第二個任務就阻塞了(這裡只考慮單執行緒的情況下,多執行緒後面再講),甚至如果第乙個任務花費的時間過長,還可能會使第三第四個任務被阻塞。被阻塞的任務就像排隊的人一樣,一旦前乙個任務沒了,它就立馬執行。

通俗來講,使用上廁所來舉例,每個人的上廁所的等待時間規定為30s

使用fixeddelay就是等到前乙個人從廁所出來了,從這個人的結束時間開始,另乙個人等待30s才進去,這個人進去了,下乙個在門外等候。

使用fixedrate就是前乙個人進去的瞬間開始計時,如果這個人用了3秒就出來了,下乙個人只用等27秒即可,如果這個人用的時間超過了30s,那麼下乙個人就可以直接推門進去了,看著前乙個人上廁所,前乙個人結束了,這個人馬上就占用了廁所。如果這個人超過了60秒,那麼會有兩個人進來排隊看這個人上廁所.如果這個人便秘,那麼沒過30s就會有乙個人進來看望他。大概就是這個意思吧!

3.cron:使用表達是進行任務的執行,例如:@scheduled(cron = "0/15 * * * * ? ")每隔15秒執行一次

cron一般是六個或七個字段,分別是:

1. seconds (秒)

2. minutes (分)

3. hours (時)

4. day (每月的第幾天,day-of-month)

5. month (月)

6. day (每週的第幾天,day-of-week)

7. year (年 可選字段)

每隔欄位的範圍以及特殊字元

秒 :範圍:0-59

分 :範圍:0-59

時 :範圍:0-23

天(月) :範圍:1-31,但要注意一些特別的月份2月份沒有只能1-28,有些月份沒有31

月 :用0-11 或用字串 「jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov and dec」 表示

天(周):用1-7表示(1 = 星期日)或用字元口串「sun, mon, tue, wed, thu, fri and sat」表示

年:範圍:1970-2099

「/」:表示為「每」,如「0/10」表示每隔10分鐘執行一次,「0」表示為從「0」分開始, 「3/20」表示表示每隔20分鐘執行一次

「?」:只用於月與周,表示不指定值

「l」:只用於月與周,5l用在月表示為每月的最後第五天天;1l用在周表示每週的最後一天;

「w」::表示有效工作日(周一到周五),只能出現在day-of-month,系統將在離指定日期的最近的有效工作日觸發事件。例如:在 dayofmonth使用5w,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(周一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,w的最近尋找不會跨過月份

「#」:用於確定每個月第幾個星期幾,只能出現在dayofmonth域。例如在4#2,表示某月的第二個星期三。

「*」 代表整個時間段。

注意:每個元素可以是乙個值(如6),乙個連續區間(9-12),乙個間隔時間(8-18/4)(/表示每隔4小時),乙個列表(1,3,5),萬用字元。由於"月份中的日期"和"星期中的日期"這兩個元素互斥的,必須要對其中乙個設定『?』

表示式例項(網上搜的,感覺例子都一樣, = =):

0 0 10,14,16 * * ? 每天上午10點,下午2點,4點

0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時

0 0 12 ? * wed 表示每個星期三中午12點

"0 0 12 * * ?" 每天中午12點

"0 15 10 ? * *" 每天上午10:15

"0 15 10 * * ?" 每天上午10:15

"0 15 10 * * ? *" 每天上午10:15

"0 15 10 * * ? 2005" 2023年的每天上午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" 2023年至2023年的每月的最後乙個星期五上午10:15

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

SpringBoot 定時任務

第一步 在啟動類中加入如下註解 enablescheduling public class public static void main string args 注意 enablescheduling必須加,否則無法開啟定時任務 第二步 建立定時任務 component public class ...

Spring boot定時任務

最近做專案,需要使用定時任務,半個小時去更新redis資料,於是便學習了一下經驗。希望可以幫到你們。定時任務可使用三種 created by fx on 2017 9 4.component allargsconstructor public class featuredatatask 實現乙個任務...

Spring boot 定時任務

1.在啟動類上加 enablescheduling註解 package com.example.demo import org.springframework.scheduling.annotation.enablescheduling enablescheduling public static ...