ErrorChannel未在不同步骤中填充

时间:2015-11-03 15:36:23

标签: spring-integration

我知道这是一个经常被问到的问题,但我的问题似乎有点不同。

简短介绍:
我有一个针对队列进行轮询的DMLC 之后,消息通过DirectChannel发送到
中,我使用 unmarshalling-transformer (转换传入xml到interface-object)。 然后再次执行不同的步骤(验证等,全部通过DirectChannel),在流程结束时,我想将(已转换的)消息插入数据库。

在下面的流程中,有不同的“错误来源”。例如,输入消息不正确,无法转换(解组)到对象中。或者无法实现数据库插入记录。

现在有关不同错误类型的问题:
如果输入消息无法转换或数据验证产生错误,我想向错误通道发送错误消息(或异常),因为它没有意义回滚邮件。
如果数据库插入失败(可能是由于“系统挂起”),我想回滚消息到输入队列(peInputQueue)。

从config-xml中附上一个snipplet:

    <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”都抛出异常,则回滚消息 但这是我所期待的。我想将消息调整到错误通道。因此,我将“header-richher”(请参阅​​chain-element)中的标头增强为errorChannel。
在“validationBean”中,我识别出MessageHeaders中的errorChannel,但不幸的是它不起作用。 而不是这样,启动回滚。 :-(

那么我怎样才能达到(我的)期望的解决方案。

任何帮助都非常感谢 亲切的问候,
博多

1 个答案:

答案 0 :(得分:0)

  1. error-channel标头无法访问。因为一切都在同一个线程中,所以,抛出的异常就像常规Java一样。

  2. 异常会在ChannelPublishingJmsMessageListener.GatewayDelegate

  3. 中被捕获
  4. 由于根据您的配置没有error-channel,因此会重新抛出DefaultMessageListenerContainer以进行rallback。

  5. 所以,您应该在error-channel上进行<jms:message-driven-channel-adapter>配置,并且还应该添加一些ErrorHandler来切断&#34; rallback或不#34}逻辑。