2016-06-10 52 views
0

我有運行嵌入式暗潮一個Web服務,以及一些處理程序使用卸載請求的工作線程共同暗潮模式:如何處理Undertow工作線程拋出的異常?

if (exchange.isInIoThread()) { 
    exchange.dispatch(this); 
} 

這是偉大的表現,但它提出在處理一個問題與錯誤處理。我創建了一個自定義的ErrorHandler,它將Java異常映射到HTTP響應類型和日誌級別,並允許API處理程序自己冒出異常並且不用擔心處理它們。不幸的是,對於派發到工作線程的請求,他們從來沒有把它放到ErrorHandler中,如果他們拋出異常,總是會導致500錯誤。有什麼辦法來捕捉工作線程拋出的異常,還是我必須在每個API處理程序中實現異常處理?

+0

您可以爲每個線程設置'UncaughtExceptionHandler'來處理線程拋出的異常 – Saravana

+0

處理程序需要訪問HttpServerExchange以處理失敗的請求。如果我控制所有處理程序的代碼,就可以將其傳入,但有很多內置的處理程序可以使用,例如https://github.com/undertow-io/undertow/blob/主/核心/ SRC /主/ JAVA/IO /暗流/安全/處理/ AuthenticationCallHandler.java#L46。 – Jared

回答

1

我最後在鏈中立即添加了一個處理程序,以便立即將請求分派給工作線程。然後,我在exchange.isInIoThread()檢查之外添加了錯誤處理邏輯,確保錯誤處理程序和拋出異常的處理程序始終位於同一個線程中。