Spring Integration:侦听入站网关的异常

时间:2013-04-04 07:44:36

标签: exception-handling integration spring-integration channel

我刚接触弹簧集成,所以我可能会滥用条款。 我有一个ws:inbound-gateway监听soap web服务请求。

<int-ws:inbound-gateway id="myInGW"
                        request-channel="headersMapPopulationChannel"
                        reply-channel="ws-response-channel"
                        marshaller="marshaller"
                        unmarshaller="marshaller"/>

它将传入的请求发送到headersMapPopulationChannel,并将消息发送到适配器(用于从JAXB类转换为域),拆分器将其拆分为验证,日志记录和持久性。在持久性之后,我正在运行与业务相关的事情。我希望在所有这些上都有异常控制点,这样我就可以管理在异常的情况下要做什么。我故意在业务类中放置一个throw异常语句。抛出异常,但我的频道似乎没有得到它。 配置:

<int-ws:inbound-gateway id="myInGW"
                        request-channel="headersMapPopulationChannel"
                        reply-channel="ws-response-channel"
                        error-channel="ws-error-channel"
                        marshaller="marshaller"
                        unmarshaller="marshaller"/>

<int:channel id="ws-error-channel"/>

<int:service-activator input-channel="ws-error-channel"
                       expression="@exceptionHandlerService.handleThrowable(payload)"/>
<bean id="exceptionHandlerService" class="pack.integration.service.ExceptionHandlerService"/>

另外,我不知道在我最外面的频道中控制异常是否正确。无论我转发消息,我都应该听取异常吗?

2 个答案:

答案 0 :(得分:1)

这是处理异常的正确方法。

该异常将包含在MessagingException中,并作为error-channel的有效内容发送到ErrorMessageMessagingException有两个属性cause(原始异常)和failedMessage(导致异常的消息)。

如果要将SOAP错误返回给客户端,则错误通道流必须抛出异常。

如果你没有在频道上看到ErrorMessage,那么其他东西必须抓住异常。

我建议您启用调试日志记录并通过系统跟踪消息。

答案 1 :(得分:0)

我还使用段网关将所有异常重定向到另一个消息流,并从那里决定如何处理它们。