移动到下一个收件人并在其中一个recipient-list-router遇到错误时调用错误通道

时间:2017-11-24 07:08:40

标签: spring-integration spring-jms

如果" firstChannel"中出现任何异常流量,以下两种情况之一正在发生:

  1. 使用ignore-send-failures =" true" property," secondChannel"是 调用和" myErrorChannel"没有被调用。
  2. 没有ignore-send-failures =" true" property," secondChannel"没有被调用和" myErrorChannel"被调用。
  3. 请建议我如何调用" secondChannel"和#34; myErrorChannel"如果在" firstChannel"中引发任何异常流。 请参阅以下配置详细信息:

    <int:channel id="myErrorChannel" datatype="java.lang.Throwable"/>
        <int:service-activator input-channel="myErrorChannel" >
            <beans:bean class="org.springframework.integration.samples.jms.ErrorServiceActivatorProxy"></beans:bean>
        </int:service-activator>
    
    <jms:message-driven-channel-adapter id="jmsIn" channel="jmsInChannel" destination="requestQueue" error-channel="myErrorChannel"/>
    
    <int:channel id="firstChannel" />
    <int:channel id="secondChannel" />
    
    <int:recipient-list-router id="recipientListRouter" input-channel="jmsInChannel" ignore-send-failures="true">
        <int:recipient channel="firstChannel"/>
        <int:recipient channel="secondChannel"/>
    </int:recipient-list-router>
    
    <int:channel id="firstChannelOutboundChannel"/>
    <int:transformer input-channel="firstChannel" output-channel="firstChannelOutboundChannel">
        <beans:bean class="org.springframework.integration.samples.jms.FileIOTransformer"></beans:bean>
    </int:transformer>
    
    <jms:outbound-channel-adapter
            id="firstChannelOutbound"
            channel="firstChannelOutboundChannel"
            connection-factory="jmsConnectionFactory"
            destination="outputQueueOne"
            auto-startup="true" />
    
    <jms:outbound-channel-adapter
            id="secondChannelOutbound"
            channel="secondChannel"
            connection-factory="jmsConnectionFactory"
            destination="outputQueueTwo"
            auto-startup="true"/>
    

1 个答案:

答案 0 :(得分:0)

它的工作方式是这样的,因为下游流程就像是流程中第一个组件的单个黑盒子调用。我们从那里发送一条消息,因此我们只能捕获一个异常并停止执行。

然而,我们可以将try-catch机制更接近有罪代码。由于您遇到第一个收件人的问题,您必须在那里处理错误并吞下异常。这样,收件人列表路由器将不知道第一个收件人中的错误,并将调用第二个收件人。

FileIOTransformer中添加try-catch的最简单方法。但是,您可以将ExpressionEvaluatingRequestHandlerAdvicetrapException一起使用为true:https://docs.spring.io/spring-integration/docs/4.3.12.RELEASE/reference/html/messaging-endpoints-chapter.html#expression-advice。但是需要记住,这种建议只能直接应用于当前组件。它不会捕获下游的异常。

另一个技巧是使用try-catch实现ChannelInterceptor并将其添加到firstChannel