2015-04-12 71 views
2

我讀過,如果在流中拋出異常,框架首先要做的是檢查錯誤通道屬性的消息頭。情況總是如此嗎?在彈簧集成中的錯誤處理/傳播

在我的特殊情況下,我將一個自定義錯誤通道分配給消息頭,但消息似乎傳播到最近的錯誤處理程序/錯誤通道。

<int:chain id="buildAggregatedResponseChain" input-channel="aggregatedResultChannel" 
       output-channel="sendAggregatedChannel"> 
     <int:header-enricher> 
      <int:error-channel ref="myErrorChannel"/> 
     </int:header-enricher> 
     <int:service-activator ref="service" method="doSomething"/> 
    </int:chain> 

我明確地在doSomething中拋出一個異常,但這個異常永遠不會在myErrorChannel中結束。相反,它被「傳播」到流上最近的ErrorHandler,或傳播到int-mail:imap-idle-channel-adapter(嘗試了幾個不同的流)的流上指定的錯誤通道。 我錯過了什麼?也許有人可以概述錯誤處理/錯誤傳播的主要原理(例如,當談論幾個事務等)時?這裏有一些信息,但它很分散而且不繫統。

回答

2

它取決於上游流量;如果有異步切換,則查詢頭部;否則,異常將返回到入站端點。

一般來說,我會建議不要修改框架標題,如errorChannel。而是在入站端點(例如您的imap空閒適配器)上放置一個error-channel,並處理該流上的錯誤。

很少需要直接修改標題。如果你想插入不同的錯誤處理中等流動,那麼你可以將消息發送網關...

<int:service activator ... ref="gw" /> 

<int:gateway id="gw" default-request-channel="..." 
    error-channel="midFlowErrorChannel" /> 

如果下游流量(來自網關)成功返回任何結果,那麼一定要加一個默認回覆超時時間爲0(或使用返回void的方法使用自定義服務接口)。

+0

「如果你想插入不同的錯誤處理中流,那麼你可以插入一個消息傳遞網關」 - 那我會問下一步:) – yuranos87