如果" firstChannel"中出现任何异常流量,以下两种情况之一正在发生:
请建议我如何调用" 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"/>
答案 0 :(得分:0)
它的工作方式是这样的,因为下游流程就像是流程中第一个组件的单个黑盒子调用。我们从那里发送一条消息,因此我们只能捕获一个异常并停止执行。
然而,我们可以将try-catch机制更接近有罪代码。由于您遇到第一个收件人的问题,您必须在那里处理错误并吞下异常。这样,收件人列表路由器将不知道第一个收件人中的错误,并将调用第二个收件人。
在FileIOTransformer
中添加try-catch的最简单方法。但是,您可以将ExpressionEvaluatingRequestHandlerAdvice
与trapException
一起使用为true:https://docs.spring.io/spring-integration/docs/4.3.12.RELEASE/reference/html/messaging-endpoints-chapter.html#expression-advice。但是需要记住,这种建议只能直接应用于当前组件。它不会捕获下游的异常。
另一个技巧是使用try-catch实现ChannelInterceptor
并将其添加到firstChannel
。