摘要:注意為了共享在同一個中的,我們需要在上面這個實現(xiàn)類上加入和注解,詳見定時任務(wù)二多線程并發(fā)執(zhí)行與數(shù)據(jù)共享。捕獲異常,取消所有觸發(fā)器在我們捕獲異常時,可以調(diào)用取消所有與這個作業(yè)有關(guān)的觸發(fā)器。
1. 作業(yè)異常版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009141079
org.quartz.JobExecutionException 會在 Scheduler(調(diào)度器)運行錯誤時,由 job(作業(yè))實現(xiàn)類拋出。
1.1 捕獲并解決異常,立即重新執(zhí)行作業(yè)在我們捕獲異常并解決異常后,可以調(diào)用 JobExecutionException#setRefireImmediately(true) 立即重新執(zhí)行作業(yè)。
假設(shè)我們有一個會拋出異常的 job 實現(xiàn)類,job 實現(xiàn)類的代碼片斷如下:
try { // 一個異常例子,假設(shè)第一次傳入的 denominator 為 0,那么將會拋出異常 calculation = 4815 / denominator; } catch (Exception e) { JobExecutionException e2 = new JobExecutionException(e); // 在第一次異常后,修改 denominator 參數(shù)為 1,那么后面的執(zhí)行就不會出錯了 dataMap.put("denominator", "1"); // true 表示立即重新執(zhí)行作業(yè) e2.setRefireImmediately(true); throw e2; }
上面的作業(yè)會在第一次執(zhí)行時拋出 java.lang.ArithmeticException: / by zero 異常后,馬上又會執(zhí)行一次,之后都可以正常執(zhí)行作業(yè)。
注意: 為了共享在同一個 JobDetail 中的 JobDataMap,我們需要在上面這個 job 實現(xiàn)類上加入 @PersistJobDataAfterExecution 和 @DisallowConcurrentExecution 注解,詳見 Quartz 2 定時任務(wù)(二):多線程并發(fā)執(zhí)行與數(shù)據(jù)共享。
1.2 捕獲異常,取消所有觸發(fā)器在我們捕獲異常時,可以調(diào)用 JobExecutionException#setUnscheduleAllTriggers(true) 取消所有與這個作業(yè)有關(guān)的觸發(fā)器。
假設(shè)我們有一個會拋出異常的 job 實現(xiàn)類,job 實現(xiàn)類的代碼片斷如下:
try { // 一個異常例子 int zero = 0; calculation = 4815 / zero; } catch (Exception e) { JobExecutionException e2 = new JobExecutionException(e); // true 表示 Quartz 會自動取消所有與這個 job 有關(guān)的 trigger,從而避免再次運行 job e2.setUnscheduleAllTriggers(true); throw e2; }
上面的作業(yè)會在拋出異常后,就不再執(zhí)行任何有關(guān)該作業(yè)的觸發(fā)器了。
2. 作業(yè)中斷org.quartz.InterruptableJob 接口提供了一種中斷機(jī)制,這個接口只有一個方法 interrupt(),這個方法會在用戶發(fā)出中斷請求到 Scheduler(調(diào)度器)時觸發(fā)(即調(diào)用 Scheduler#interrupt(JobDetail#getKey()) 方法時觸發(fā))。
其中 InterruptableJob 接口又繼承了 Job 接口,所以當(dāng)我們使用時,只需要實現(xiàn) InterruptableJob 接口,重寫其中的 execute 和 interrupt 方法即可。
3. 參考Quartz API
PS:本文針對的 Quartz 版本為 Quartz 2.2.3。官方下載地址:Quartz 2.2.3 .tar.gz
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67077.html
摘要:由于標(biāo)題長度限制,原題是這樣某系統(tǒng)萬,每十分鐘統(tǒng)計一下請求次數(shù)最多的個。請求寫到日志的話,其實就是超大文件中統(tǒng)計問題。 由于標(biāo)題長度限制,原題是這樣:某系統(tǒng)QPS100萬,每十分鐘統(tǒng)計一下請求次數(shù)最多的100個IP。ip請求寫到日志的話,其實就是超大文件中統(tǒng)計top k問題。10分鐘6億條記錄,大約是10G級別,所以對于一般單機(jī)處理來講不能一次性加載到內(nèi)存計算。所以分治算法是處理這類問...
摘要:在定時器接口的方法中我們可以發(fā)現(xiàn)一個方法接受接口,而也是一個接口,抽象了觸發(fā)任務(wù)執(zhí)行的觸發(fā)器。更常用的一個觸發(fā)器是,它使用表達(dá)式指定何時執(zhí)行任務(wù)。配置定時任務(wù)首先看看配置。配置提供了命名空間,讓配置定時任務(wù)非常簡單。 本文參考自Spring官方文檔 34. Task Execution and Scheduling。 在程序中常常有定時任務(wù)的需求,例如每隔一周生成一次報表、每個月月末清...
摘要:三實踐案例案例簡介分布式系統(tǒng)中,微服務(wù)基礎(chǔ)組件等,系統(tǒng)中間件,等,對常用功能配置等,進(jìn)行二次淺封裝并統(tǒng)一集成管理,以滿足日常開發(fā)中基礎(chǔ)環(huán)境搭建與臨時工具的快速實現(xiàn)。 一、背景簡介 分布式系統(tǒng)中存在很多拆分的服務(wù),在不斷迭代升級的過程中,會出現(xiàn)如下常見的棘手情況: 某個技術(shù)組件版本升級,依賴包升級導(dǎo)致部分語法或者API過期,或者組件修復(fù)緊急的問題,從而會導(dǎo)致分布式系統(tǒng)下各個服...
摘要:也是自帶的一個基于線程池設(shè)計的定時任務(wù)類。其每個調(diào)度任務(wù)都會分配到線程池中的一個線程執(zhí)行,所以其任務(wù)是并發(fā)執(zhí)行的,互不影響。 原創(chuàng)不易,如需轉(zhuǎn)載,請注明出處https://www.cnblogs.com/baixianlong/p/10659045.html,否則將追究法律責(zé)任?。?! 一、在JAVA開發(fā)領(lǐng)域,目前可以通過以下幾種方式進(jìn)行定時任務(wù) 1、單機(jī)部署模式 Timer:jdk中...
閱讀 3000·2023-04-26 00:23
閱讀 3413·2021-09-13 10:28
閱讀 2198·2021-08-31 14:18
閱讀 2898·2019-08-30 15:54
閱讀 1955·2019-08-30 15:43
閱讀 1290·2019-08-29 16:56
閱讀 2816·2019-08-29 14:16
閱讀 2068·2019-08-28 17:51