2013-01-09 33 views
0

在我們的應用程序中,我們有錯誤處理機制,我們在錯誤處拋出運行時異常。我注意到一個奇怪的行爲,我想了解這一個從ServiceActivator與過濾器拋出異常的行爲有所不同

1)情況1背後的機制:異常來自ServiceActivator拋出轉化爲MessageHandlingException

當在ServiceActivator,我們拋出一個異常錯誤發生。我們上ErrorChannel該消息具有有效載荷org.springframework.integration.MessageHandlingException和實際的異常拋出cause

2)情況2:從過濾器拋出的異常沒有與MessageHandlingException

當過濾器發生錯誤掩蓋,我們拋出異常,那麼有效載荷是實際的異常,並且不與org.springframework.integration.MessageHandlingException

掩蓋我有幾個問題:

  • 爲什麼從ServiceActivator異常拋出行爲d ifferently比過濾
  • 是否有一些「最佳做法」周圍的錯誤處理Spring的集成項目,同時利用errorChannel和相關基礎設施

更新1:

過濾器延伸AbstractFileListFilter這是過濾器鏈的一部分 - 實現FileListFilter的自定義CompositeFileFilter

CompositeFileFilter正在被文件:入站通道適配器使用,並將輸出傳遞給下面聲明的通道:

<int:channel 
    id="channelForFilesComingIn" 
    datatype="java.io.File" 
> 
    <int:dispatcher task-executor="dispatchExecutor" /> 
</int:channel> 

更新2:

激起我們正在試圖做的是讀取文件系統中的文件並進行處理。在文件讀取部分,使用帶有CompositeFilter的file:inbound-channel-adapter來過濾未完全上傳或不符合命名標準的文件。

後所有過濾器通過,文件被移交到一個ServiceActivator用於處理

在任一上述(濾波器鏈或服務),如果存在錯誤情況,它必須被報告給DB,並通過電子郵件。爲了實現這一點,我們拋出被ErrorChannel捕獲並傳遞給專門通道的ApplicationException。

+0

您使用的是什麼版本的Spring集成?我剛剛運行了一個測試,從過濾器中拋出一個異常,並按預期接收到MessageHandlingException。請提供更多詳細信息,包括配置。 –

+0

我正在使用2.1.4。我在調試會話中注意到了這種行爲。我附上更多的細節問題。 –

+0

我以爲你在談論元素,考慮到你將它與進行比較。文件列表過濾器用於MessageSource中,它不是直接調用的組件。也許你可以分享更多關於你想要做什麼的信息。 –

回答

0

只是要清楚,一個MessageHandlingException被拋出(包用戶除外)時,消息處理失敗 - 消息處理程序是什麼,處理消息。

如果MessageSource中出現異常,則表示沒有消息,因此MessageHandlingException(或任何MessagingException)不適用。

取而代之,輪詢失敗,異常返回給輪詢器。

如果你想處理在輪詢端點(MessageSource)例外,你需要給輪詢的ErrorHandlingTaskExecutor,到你能提供一個ErrorHandler,做你想要什麼不同之處,但由於沒有消息還,這是MessageSource引發的原始異常。

如果您想將它發送到錯誤頻道,您需要在自定義ErrorHandler中執行此操作。

+0

謝謝加里,當然有幫助! –