理解Spring定時任務 Scheduled

2021-09-20 02:53:34 字數 2076 閱讀 4245

//定義乙個按時間執行的定時任務,在每天16:00執行一次。

@scheduled(cron = "0 0 16 * * ?") public void depositjob()

//定義乙個按一定頻率執行的定時任務,每隔1分鐘執行一次

@scheduled(fixedrate = 1000 * 60) public void job2()

//定義乙個按一定頻率執行的定時任務,每隔1分鐘執行一次,延遲1秒執行

@scheduled(fixedrate = 1000 * 60,initialdelay = 1000) public void updatepayrecords()

fixedrate和fixeddelay都是表示任務執行的間隔時間

fixedrate和fixeddelay的區別:

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

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

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

下面用**來具體驗證一下。

@enablescheduling

private atomicinteger number = new atomicinteger();

public static void main(string args)

@scheduled(fixedrate = 5000 )

public void job() catch (interruptedexception e)

localtime end = localtime.now();

system.out.println(thread.currentthread() + " end " + number.get() + " @ "+

end + ", seconds cost "+ (chronounit.seconds.between(start, end)));

}} 執行結果如下:

可以看到任務第一次執行完以後還有間隔4秒才執行第二次,可是到了第二次結束的時候,就沒有間隔了,直接就執行第三次了。甚至在執行第四次的時候,明明第四次任務只花費了1秒,可還是馬上就執行第五次了。因為前面兩次任務花費的時間太久了,有好幾個被排程的任務都被阻塞了。所以當第四次一結束,馬上第五次就執行了。

@scheduled(fixedrate)如何避免任務被阻塞

答案是加上註解 @enableasync(在類上加)和@async(在方法上加),加了註解以後,就開啟了多執行緒模式,當到了下一次任務的執行時機時,如果上一次任務還沒執行完,就會自動建立乙個新的執行緒來執行它。非同步執行也可以理解為保證了任務以固定速度執行。

開啟多執行緒後執行結果如下:

可以看到,開啟多執行緒後,每次任務開始的間隔都是5秒鐘。這是符合我們預期的,但是最後還有點缺陷,這種情況下的執行緒是隨著任務一執行完就銷毀的,等下次有需要了程式再建立乙個。每次都要重新建立明顯是太影響效率了,所以需要在**裡給他乙個執行緒池。

建立乙個執行緒池

@bean

public taskscheduler taskscheduler()

Spring定時任務

sayhello 0 08 21 下面的表示式 0 15 10 6l 2002 2005 將在2002年到2005年的每個月的最後乙個星期五上午10點15分執行作業。你不可能用 trigger來做這些事情。你可以用兩者之中的任何乙個,但哪個跟合適則取決於你的排程需要。更多詳細介紹參考此處 關於cro...

spring 定時任務

xmlns 多加下面的內容 xmlns task 然後xsi schemalocation多加下面的內容 spring task 3.1.xsd最後是我們的task任務掃瞄註解 或者 public inte ce imytestservice component import org.springf...

Spring 定時任務

scheduled cron 0 0 1 override public synchronized void dojob throws exception 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期...