Spring integration 错误通道未在不同步骤中填充

Spring integration 错误通道未在不同步骤中填充,spring-integration,Spring Integration,我知道这是一个经常被问到的问题,但我的问题似乎有点不同 简短介绍: 我有一个针对队列轮询的DMLC。 之后,消息通过DirectChannel发送到链。在链中,我使用解组转换器(将传入的xml转换为接口对象)。 然后再次执行不同的步骤(验证等,全部通过DirectChannel),在流程的末尾,我希望将(转换的)消息插入到数据库中 在下面的流程中有不同的“错误源”。例如,输入消息不正确,无法转换(解组)为对象。或者数据库无法插入记录 现在,关于不同错误类型的问题: 如果无法转换输入消息或数据验证

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

简短介绍:
我有一个针对队列轮询的DMLC。
之后,消息通过DirectChannel发送到链。
在链中,我使用解组转换器(将传入的xml转换为接口对象)。 然后再次执行不同的步骤(验证等,全部通过DirectChannel),在流程的末尾,我希望将(转换的)消息插入到数据库中

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

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

从配置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 enricher”(参见chain元素)中的header增强为errorChannel
在“validationBean”中,我识别了MessageHeader中的errorChannel,但不幸的是它不起作用。 而不是启动回滚:-(

那么我怎样才能达到我想要的解决方案呢

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

  • 无法访问该
    错误通道
    头。因为所有内容都在同一个线程中,所以会像普通Java一样引发异常

  • 异常在
    ChannelPublishingJmsMessageListener.GatewayDelegate中捕获

  • 根据您的配置,由于没有
    错误通道
    ,因此会将其重新抛出到
    DefaultMessageListenerContainer
    进行回调

  • 因此,您应该在
    上进行
    错误通道
    配置,还应该添加一些
    错误处理程序
    ,以切断“回调或不回调”逻辑

  • 无法访问该
    错误通道
    头。因为所有内容都在同一个线程中,所以会像普通Java一样引发异常

  • 异常在
    ChannelPublishingJmsMessageListener.GatewayDelegate中捕获

  • 根据您的配置,由于没有
    错误通道
    ,因此会将其重新抛出到
    DefaultMessageListenerContainer
    进行回调


  • 因此,您应该在
    上进行
    错误通道
    配置,还应该添加一些
    错误处理程序
    ,以切断“回调与否”逻辑。

    嗨,阿尔特姆,非常感谢您的帮助!我遵循您的第3点,它与自己的错误处理程序一起工作得非常好。

    好心,博多格拉德!好的语气应该是接受答案:-)嗨,阿泰姆,非常感谢你的帮助!我遵循您的第3点,它与自己的ErrorHandler一起工作得很好。:-)好心的问候,菩萨听到了!最好的语气是接受答案:——)