@DisallowConcurrentExecution 注解的作用 【定時器執行完當前任務才開啟下一個線程的方式】


轉:

@DisallowConcurrentExecution 注解的作用

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秒時再啟用新的線程執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM