版權聲明:本文由吳仙傑創做整理,轉載請註明出處:http://www.javashuo.com/article/p-htuxizqf-bc.htmlhtml
org.quartz.JobExecutionException
會在 Scheduler(調度器)運行錯誤時,由 job(做業)實現類拋出。java
在咱們捕獲異常並解決異常後,能夠調用 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 定時任務(二):多線程併發執行與數據共享。併發
在咱們捕獲異常時,能夠調用 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
org.quartz.InterruptableJob
接口提供了一種中斷機制,這個接口只有一個方法 interrupt()
,這個方法會在用戶發出中斷請求到 Scheduler(調度器)時觸發(即調用 Scheduler#interrupt(JobDetail#getKey())
方法時觸發)。htm
其中 InterruptableJob
接口又繼承了 Job
接口,因此當咱們使用時,只須要實現 InterruptableJob
接口,重寫其中的 execute
和 interrupt
方法便可。
PS:本文針對的 Quartz 版本爲 Quartz 2.2.3。官方下載地址:Quartz 2.2.3 .tar.gz