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