quartz在job間隔期間內,保證上一個任務執行完後,再去排程下一個任務(轉),在多執行緒情況下的問題
Quartz定時任務預設都是併發執行的,不會等待上一次任務執行完畢,只要間隔時間到就會執行,這樣往往會導致我們執行的資料不正確。如果定時任執行太長,會長時間佔用資源,導致其它任務堵塞。
解決辦法:
1.在Spring中這時需要設定concurrent的值為false, 禁止併發執行。
<property name="concurrent" value="true" />
2.當不使用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),建議和我一樣把多執行緒的部分提到前面啟動哪一個部分。這樣就可以具備多執行緒又可以使得註釋有效。
相關文章
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- OpenMP 中的執行緒任務排程執行緒
- 在Web應用程式中執行計劃任務(多執行緒) (轉)Web執行緒
- job 執行時間比排程間隔時間長
- laravel框架任務排程(定時執行任務)Laravel框架
- 如何使用cron任務每隔2天在固定時間執行任務
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- Flink - Task 任務排程執行流程
- 保證執行緒在主執行緒執行執行緒
- javascript 實現一個帶併發限制的非同步排程器,保證同時最多執行2個任務JavaScript非同步
- job任務均不執行,手工執行報job now running
- 微任務和巨集任務哪個先執行
- 請教一個事務+多執行緒 的問題執行緒
- Crontab 任務不執行問題
- Python建立多執行緒任務並獲取每個執行緒返回值Python執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- Oracle診斷案例:Job任務停止執行(轉)Oracle
- Linux 中 Laravel 任務排程不執行LinuxLaravel
- 批量任務體現多執行緒的威力!執行緒
- 基於Hyperf開發的任務排程系統.支援任務投遞,DAG任務編排(多個任務使用同一個事務).
- php:多程式執行任務PHP
- jdk排程任務執行緒池ScheduledThreadPoolExecutor工作原理解析JDK執行緒thread
- 利用nodejs 執行多個js 指令碼,casperjs 同行執行多個任務NodeJS指令碼
- 如何使用WorkManager執行後臺任務(上)
- 定義JOB的執行間隔
- laravel建立定時任務並在windows下執行LaravelWindows
- C# 執行緒與任務C#執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- C#多執行緒(13):任務基礎①C#執行緒
- C#多執行緒(14):任務基礎②C#執行緒
- C#多執行緒(15):任務基礎③C#執行緒
- Java 多執行緒處理任務的封裝Java執行緒封裝
- 在 JS 中如何排程後臺任務?JS
- Oracle診斷案例-Job任務停止執行Oracle
- 讓CPU對多個任務輪流交替執行
- Java多執行緒並行處理任務的實現Java執行緒並行
- Quartz任務排程快速入門quartz