2016-10-21 41 views
1

我在spring-boot 1.3.5.RELEASE應用程序上有一個休息API,使用ThreadPoolExecutor異步啓動該進程。來自新線程的彈簧引導日誌運行時異常

我的問題是,異步過程恰巧爲沒有處理的場景拋出運行時異常,但堆棧跟蹤不在我的日誌中。我正在使用log4j。

這是一個很大的問題,因爲它需要花費很多時間來調試並查看實際問題。

我知道@ControllerAdvice,但我認爲它的上下文在新線程啓動時結束並且不再攔截異常。

我該如何配置ThreadPoolExecutor以將不需要的異常重定向到spring上下文,或者我應該如何處理這個問題?

我要尋找一個通用的解決方案來捕獲這些類型的異常及其堆棧跟蹤添加到附加目的地,因爲我不知道在哪裏開發商將開始一個新的線程將與未捕獲的異常

崩潰比方說,其餘的看起來像這樣:

@RequestMapping("/api/test") 
public void doSomething() { 
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 10 , TimeUnit.SECONDS, new ArrayBlockingQueue<>(10, true)); 
    threadPoolExecutor.execute(() -> { 
     throw new RuntimeException("some exception"); 
    }); 
} 
+1

而不是通過您自己的嘗試使用'@ Async'註釋來處理線程池。 使用'@ Async'註解的方法將在單獨的線程上運行。然後,如果發生異常,您可以在您的控制器中使用'@ ExceptionHandler'處理它 –

+0

這是一個遺留應用程序,需要大量重構 –

回答

0

您是否嘗試過創建@ControllerAdvice,注射的Throwable進去和呼叫記錄?