我知道這是一個問題,經常被問到,但我的問題似乎有點不同。ErrorChannel沒有在不同的步驟中填充
簡短介紹:
我有一個DMLC輪詢隊列。
之後,該消息通過DirectChannel發送到鏈。
在鏈內我使用了一個反編組變換器(將傳入的xml轉換爲接口對象)。 然後再次不同的步驟(驗證等,所有通過DirectChannel),並在流的結尾,我想插入(轉換)的消息到數據庫中。
在下面的流程中有不同的「錯誤來源」。例如,輸入消息不正確,無法轉換(解組)到對象中。或者數據庫無法實現插入記錄。
現在關於不同的錯誤類型的問題:
如果輸入的消息無法轉化或數據的驗證產生的錯誤,我想送一個錯誤消息(或除外)到錯誤-channel,因爲它回滾消息沒有意義。
如果數據庫插入失敗(可能是由於「系統掛起」),我想回滾消息到輸入隊列(peInputQueue)。
包圍的snipplet從配置的XML:
<jms:message-driven-channel-adapter id="peMessageDrivenAdapter"
channel="jmsHeaderEnricherChannel"
acknowledge="transacted"
connection-factory="jmsTransactionConnectionFactory"
concurrent-consumers="1"
max-concurrent-consumers="5"
max-messages-per-task="5"
receive-timeout="500"
auto-startup="true"
destination="peInputQueue" />
<int:chain id="jmsInputChain" input-channel="jmsHeaderEnricherChannel" output-channel="routerTransformChannel">
<int:header-enricher>
<int:priority value="#{T(de.axa.batch.ecmcm.cmab.util.CmabConstants).LOW_PRIO}"/>
<int:header name="countMessage" ref="counter" />
<int:header name="protocol" value="jms"/>
<int:header name="msgReceiveDate" expression="T(System).currentTimeMillis()" />
<int:error-channel ref="errorChannel"/>
</int:header-enricher>
<int-xml:unmarshalling-transformer id="jmsModelUnmarshallerTransformer" unmarshaller="jmsModelUnmarshaller"/>
</int:chain>
<int:header-value-router input-channel="routerTransformChannel" header-name="protocol">
<int:mapping value="jms" channel="jmsTransformToCoreChannel"/>
</int:header-value-router>
<int:transformer id="jmsToCoreTransformer" input-channel="jmsTransformToCoreChannel"
ref="cmabInboundQueueMapper" output-channel="validationChannel"/>
<int:service-activator input-channel="validationChannel"
output-channel="processChannel"
ref="validationBean" />
<int:service-activator input-channel="processChannel" ref="databaseProcess"/>
在消息上述結構,如果按照實施例「validationBean」拋出異常是rollbacked。
但這是而不是我所期望的。我想將消息調整到錯誤通道。因此,我將「header-richher」(請參閱chain-element)中的標題增強爲errorChannel。
在「validationBean」中,我識別了MessageHeaders中的errorChannel,但不幸的是它不起作用。 而不是回滾啓動。 :-(
那麼,怎樣才能實現我(我的)期望的解決方案。
的任何幫助都非常欣賞。
親切的問候,
博多
嗨Artem,非常感謝你的幫助! 我遵循你的第3點,它可以使用自己的ErrorHandler完成工作。 :-) 親切的問候,Bodo – bonaly
很高興聽到!好的基調是接受答案:-) –