2015-11-03 14 views
1

我知道這是一個問題,經常被問到,但我的問題似乎有點不同。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,但不幸的是它不起作用。 而不是回滾啓動。 :-(

那麼,怎樣才能實現我(我的)期望的解決方案。

的任何幫助都非常欣賞。
親切的問候,
博多

回答

0
  1. error-channel頭不可達。因爲所有的東西都在同一個線程中,所以,拋出一個異常就像使用普通的Java一樣。

  2. 異常得到注意ght在ChannelPublishingJmsMessageListener.GatewayDelegate

  3. 而且由於沒有error-channel根據您的配置它被重新拋到DefaultMessageListenerContainer使回升。

所以,你應該做的<jms:message-driven-channel-adapter>一個error-channel配置,你也應該增加一些ErrorHandler斷絕「rallback與否」的邏輯。

+0

嗨Artem,非常感謝你的幫助! 我遵循你的第3點,它可以使用自己的ErrorHandler完成工作。 :-) 親切的問候,Bodo – bonaly

+1

很高興聽到!好的基調是接受答案:-) –