定时任务的并发_03
生活随笔
收集整理的這篇文章主要介紹了
定时任务的并发_03
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正常定時任務場景
任務1從第0秒開始執行,執行3秒結束
任務1再從第5秒開始執行,執行3秒結束,以此類推
每一個任務執行都不會有沖突,都不會有干擾,在規定的5秒時間內,任務1都能執行完成
定時任務的并發場景
什么是定時任務的并發?
任務2從第0秒開始執行,執行7秒結束,這個定時任務
任務2再從第5秒開始執行,這時第一個定時任務由于數量大尚未執行完成,任務2 開始第2次任務開始,執行7秒結束,但是,任務2執行的第一次和執行第二次有重疊部分,這一部分成為定時任務的并發,這一部分有可能處理相同的數據。
案例理解:在定時定點給一個用戶發短信,一個用戶只發一次,如果是定時任務并發,有可能給同一個用戶發送2次短信
定時任務并發代碼演示:
package com.gblfy.job;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.time.LocalTime;public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {LocalTime localTime = LocalTime.now();System.out.println(Thread.currentThread().getName()+"開始執行!" + localTime);try {//休眠7秒Thread.sleep(7000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime endTime = LocalTime.now();System.out.println(Thread.currentThread().getName()+"結束執行!" + endTime);} } 找一組分析一下: Worker-1開始執行!17:55:08 Worker-2開始執行!17:55:12 Worker-1結束執行!17:55:15 Worker-3開始執行!17:55:17 Worker-2結束執行!17:55:19 Worker-1開始執行!17:55:22 Worker-3結束執行!17:55:24定時任務并發數據開始分析: Worker-1和Worker-2 開始執行間隔5秒 Worker-1 開始執行和Worker-1 結束執行 間隔7秒Worker-2和Worker-3 開始執行間隔5秒 Worker-2 開始執行和Worker-2 結束執行 間隔7秒Worker-3和Worker-1 開始執行間隔5秒 Worker-3 開始執行和Worker-3 結束執行 間隔7秒如何防止定時任務并發?
在Job類上添加@DisallowConcurrentExecution注解
防止并發示例
package com.gblfy.job;import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.time.LocalTime;@DisallowConcurrentExecution public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {LocalTime localTime = LocalTime.now();System.out.println(Thread.currentThread().getName() + "開始執行!" + localTime);try {//休眠7秒Thread.sleep(7000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime endTime = LocalTime.now();System.out.println(Thread.currentThread().getName() + "結束執行!" + endTime);} } 找一組分析一下: Worker-1開始執行!18:08:17 Worker-1結束執行!18:08:24 Worker-2開始執行!18:08:24 Worker-2結束執行!18:08:31 Worker-3開始執行!18:08:31 Worker-3結束執行!18:08:38 Worker-1開始執行!18:08:42 Worker-1結束執行!18:08:49定時任務并發數據開始分析: Worker-1 開始執行和結束執行 間隔7秒 Worker-2 開始執行和結束執行 間隔7秒 Worker-3 開始執行和結束執行 間隔7秒Worker-2 第一次執行應該是 Worker-2開始執行!18:08:22,但是由于Worker-1還沒有結束,等待Worker-1執行完成后,Worker-2開始執行Worker-3 第一次執行應該是 Worker-3開始執行!18:08:27,但是由于Worker-2 還沒有結束,等待Worker-2執行完成后,Worker-3開始執行Worker-1 第二次執行應該是 Worker-1 開始執行!18:08:32,但是由于Worker-3 還沒有結束,等待Worker-3 執行完成后,Worker-1開始執行,單這次定時任務會觸發Qartz的Misfire的錯過機制,等到下一個節點執行第2次的Worker-1 Worker-3結束執行!18:08:38 Worker-1開始執行!18:08:42 從以上數據,可以看出,當地二次執行 Worker-1時,按照上面的規則應該是Worker-1開始執行!18:08:38,對吧? 第1次錯過:執行Worker-2 第2次錯過:執行Worker-3 當錯過2次定時任務,就會Qartz的Misfire的錯過機制Qartz的Misfire的錯過機制: 當定時任務錯過2次,之后會觸發Qartz的Misfire的錯過機制,觸發及之后,上面的錯過的2次定時任務會取消,等到下一個節點執行定時任務。總結
以上是生活随笔為你收集整理的定时任务的并发_03的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webservie报文格式
- 下一篇: SLF4J:Failed to load