ErrorChannel 未在不同步骤中填充

ErrorChannel is not filled within different steps

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

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

在下面的流程中有不同的"error sources"。例如,输入消息不正确,无法转换(解组)为 object。或者数据库无法实现插入记录。

现在关于不同错误类型的问题:
如果无法转换输入消息或数据验证产生错误,我想将 error-message (或异常)发送到 error-channel因为回滚消息没有意义。
如果 database-insert 失败(可能是由于 "system hang"),我想 回滚 消息到输入 queue (peInputQueue).

附上来自 config-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" 抛出异常,则回滚消息。
但这并不是我所期望的。我想将消息调整到错误通道中。因此,我将 "header-enricher"(参见 chain-element)中的 header 增强为 errorChannel。
在 "validationBean" 中,我识别出 MessageHeaders 中的 errorChannel,但不幸的是它不起作用。 取而代之的是启动回滚。 :-(

那么我怎样才能实现(我的)想要的解决方案。

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

  1. 无法访问 error-channel header。正因为一切都在同一个线程中,所以,就像常规 Java.

  2. 一样抛出异常
  3. 异常在 ChannelPublishingJmsMessageListener.GatewayDelegate.

  4. 中被捕获
  5. 并且由于根据您的配置没有 error-channel 因此 re-thrown 到 DefaultMessageListenerContainer 进行回滚。

因此,您应该在 <jms:message-driven-channel-adapter> 上进行 error-channel 配置,还应该添加一些 ErrorHandler 来切断 "rallback or not" 逻辑。