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