Quartz定時任務預設都是併發執行的,不會等待上一次任務執行完畢,只要間隔時間到就會執行, 如果定時任執行太長,會長時間佔用資源,導致其它任務堵塞。
在Spring中這時需要設定concurrent的值為false, 禁止併發執行。
<property name="concurrent" value="true" />
當不使用spring的時候就需要在Job的實現類上加@DisallowConcurrentExecution的註釋
@DisallowConcurrentExecution 禁止併發執行多個相同定義的JobDetail, 這個註解是加在Job類上的,
但意思並不是不能同時執行多個Job, 而是不能併發執行同一個Job Definition(由JobDetail定義),
但是可以同時執行多個不同的JobDetail, 舉例說明,我們有一個Job類,叫做SayHelloJob, 並在這個Job上加了這個註解, 然後在這個Job上定義了很多個JobDetail,
如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那麼當scheduler啟動時, 不會併發執行多個sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail,
但可以同時執行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail
@PersistJobDataAfterExecution 同樣, 也是加在Job上,表示當正常執行完Job後, JobDataMap中的資料應該被改動, 以被下一次呼叫時用。
當使用@PersistJobDataAfterExecution 註解時, 為了避免併發時, 儲存資料造成混亂, 強烈建議把 @DisallowConcurrentExecution註解也加上。
@DisallowConcurrentExecution
此標記用在實現Job的類上面,意思是不允許併發執行,按照我之前的理解是 不允許排程框架在同一時刻呼叫Job類,
後來經過測試發現並不是這樣,而是Job(任務)的執行時間[比如需要10秒]大於任務的時間間隔[Interval(5秒)],
那麼預設情況下,排程框架為了能讓 任務按照我們預定的時間間隔執行,會馬上啟用新的執行緒執行任務。
否則的話會等待任務執行完畢以後 再重新執行!(這樣會導致任務的執行不是按照我們預先定義的時間間隔執行)
測試程式碼,這是官方提供的例子。設定的時間間隔為3秒,但job執行時間是5秒,設定@DisallowConcurrentExecution以後程式會等任務執行完畢以後再去執行,否則會在3秒時再啟用新的執行緒執行