2011-10-18 67 views
3

我有一個使用Quartz庫的計劃作業的Web應用程序。最近我遇到了一個工作似乎並沒有被解僱的例子。我做了一些閱讀,如果作業拋出異常,顯然,Quartz調度器將嘗試再次執行作業。這是真的?石英計劃作業未觸發 - 可能的未處理異常?

無論如何,我根據假設上述說法是真實的做了一些故障排除。所以我們可以說我有下面的代碼片段:

try { 
    method.invoke(object, params); 
} 
catch (ExceptionA ea) { 
    ea.printStackTrace(); 
} 
catch (ExceptionB eb) { 
    eb.printStackTrace(); 
} 
// and so on so forth, catching a bunch of specific Exceptions 

重要的一點這裏要注意的是,異常本身不被抓住

因此,讓我們說被調用的方法拋出一個不被處理的異常。

public void methodBeingInvoked() throws UnhandledException { 

這裏會發生什麼?

回答

4

任何可拋出從Job中拋出將被Quartz捕獲幷包裝在JobExecutionException中,而不是被回收。 看到源代碼JobRunShell#run

有一些documentation on the Quartz website這違背這一點,但看着石英1.8.x的/ 2.0.x版本/ 2.1.x的源代碼後,該文件是錯誤的所有版本。

作業的執行方法應該包含一個try-catch塊來處理 所有可能的異常。

如果作業拋出異常,Quartz通常會立即 重新執行它(並且它可能會再次拋出相同的異常)。 如果工作捕獲到可能遇到的所有異常,則處理它們,並重新安排自己或其他工作,這樣會更好。解決這個問題。