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),建議和我一樣把多執行緒的部分提到前面啟動哪一個部分。這樣就可以具備多執行緒又可以使得註釋有效。
相關文章
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 如何使用cron任務每隔2天在固定時間執行任務
- laravel框架任務排程(定時執行任務)Laravel框架
- Flink - Task 任務排程執行流程
- job任務均不執行,手工執行報job now running
- 多執行緒執行任務時,某個執行緒拋異常,如何讓程式立即退出執行緒
- 保證執行緒在主執行緒執行執行緒
- Python建立多執行緒任務並獲取每個執行緒返回值Python執行緒
- Linux 中 Laravel 任務排程不執行LinuxLaravel
- javascript 實現一個帶併發限制的非同步排程器,保證同時最多執行2個任務JavaScript非同步
- jdk排程任務執行緒池ScheduledThreadPoolExecutor工作原理解析JDK執行緒thread
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- 微任務和巨集任務哪個先執行
- 批量任務體現多執行緒的威力!執行緒
- apscheduler 在伺服器上沒有按照指定的時間執行定時任務伺服器
- php:多程式執行任務PHP
- Spring Boot中有多個@Async非同步任務時,記得做好執行緒池的隔離!Spring Boot非同步執行緒
- 在叢集環境中執行的Spring計劃排程任務 - Stack OverflowSpring
- Oracle診斷案例-Job任務停止執行Oracle
- laravel建立定時任務並在windows下執行LaravelWindows
- 基於Hyperf開發的任務排程系統.支援任務投遞,DAG任務編排(多個任務使用同一個事務).
- ORACLE expdp在表空間較多的情況下執行非常緩慢Oracle
- C#多執行緒(13):任務基礎①C#執行緒
- C#多執行緒(14):任務基礎②C#執行緒
- C#多執行緒(15):任務基礎③C#執行緒
- Spring Task 定時任務 - 多執行緒配置Spring執行緒
- Python實現投遞多執行緒任務Python執行緒
- C# 執行緒與任務C#執行緒
- IDEA上執行Flink任務Idea
- 如何使用WorkManager執行後臺任務(上)
- 畫江湖之 PHP 多執行緒開發 【利用多執行緒 序列任務變並行處理 從而減少序列執行時間】PHP執行緒並行
- Java多執行緒並行處理任務的實現Java執行緒並行
- 讓CPU對多個任務輪流交替執行
- 實現一個併發任務執行框架框架
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 深入解析 DolphinScheduler 任務排程、拆分與執行全流程
- 使用screen後臺執行任務
- Springboot非同步任務執行緒池Spring Boot非同步執行緒
- C#多執行緒開發-任務並行庫04C#執行緒並行