Quartz 2 定時任務(三):異常與中斷處理

版權聲明:本文由吳仙傑創做整理,轉載請註明出處:http://www.javashuo.com/article/p-htuxizqf-bc.htmlhtml

1. 做業異常

org.quartz.JobExecutionException 會在 Scheduler(調度器)運行錯誤時,由 job(做業)實現類拋出。java

1.1 捕獲並解決異常,當即從新執行做業

在咱們捕獲異常並解決異常後,能夠調用 JobExecutionException#setRefireImmediately(true) 當即從新執行做業。segmentfault

假設咱們有一個會拋出異常的 job 實現類,job 實現類的代碼片段以下:api

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) 取消全部與這個做業有關的觸發器。.net

假設咱們有一個會拋出異常的 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;
}

上面的做業會在拋出異常後,就再也不執行任何有關該做業的觸發器了。code

2. 做業中斷

org.quartz.InterruptableJob 接口提供了一種中斷機制,這個接口只有一個方法 interrupt(),這個方法會在用戶發出中斷請求到 Scheduler(調度器)時觸發(即調用 Scheduler#interrupt(JobDetail#getKey()) 方法時觸發)。htm

其中 InterruptableJob 接口又繼承了 Job 接口,因此當咱們使用時,只須要實現 InterruptableJob 接口,重寫其中的 executeinterrupt 方法便可。

3. 參考

PS:本文針對的 Quartz 版本爲 Quartz 2.2.3。官方下載地址:Quartz 2.2.3 .tar.gz

相關文章
相關標籤/搜索