我们有一个EIP流,它使用基于注释的spring:4.2.x
API,spring-integration:4.2.x
API和spring-integration-java-dsl:1.1.0
API来接收来自Websphere MQ队列的消息,进行一些处理并最终返回响应另一个Websphere MQ队列。对于此流程,我们使用JMS Inbound Gateway
来同步接收来自一个队列的消息,处理它们并将响应发送回另一个队列。
JMS Inbound Gateway
配置了errorChannel
,以便将RuntimeException
路由到它(这样可以正常工作)。但是在测试期间,当我们故意在流的响应Websphere MQ队列上应用PUT_INHIBIT时(即导致流无法将响应发送回应答队列),spring日志会显示以下WARNING
日志消息:
WARN ... - Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.JMSException: MQJMS2007: failed to send message to MQ queue.
我们知道我们可以通过在WARNING
本身配置ErrorHandler
来删除MLC
日志,但是,这导致我们出现问题的原因是,当我们回复路由时,我们实际路由使用.routeToRecipients()
与.setIgnoreFailures(false)
和两个收件人进行路由 - 第一个收件人路由到JMS Inbound Gateway
的{{1}},第二个收件人路由到发送后流程,以便我们可以进行数据库更新等。这里的想法是,如果第一个收件人发送失败(即当响应队列不可用时),后发送流程不会执行,而是执行错误处理流程(例如{ {1}}流量)。但是在描述的错误场景中,我们看到了警告日志,并且仍然执行了流的发送后流程,而不是replyChannel
的流程......
就好像,此时errorChannel
的{{1}}不再适用。它是否正确?这是预期的行为吗?如果是,这是否意味着我们应该使用errorChannel
而不是JMS Inbound Gateway
作为发送后意图的响应?
JMS MLC配置:
errorChannel
JMS入站网关配置:
Inbound/Outbound Adapter
答案 0 :(得分:1)
是;网关不会那样工作。
当您将回复发送到网关时,它将在网关中排队,直到线程返回到网关;在那个时候,回复被接收并发送。因此,发送失败直到稍后(在调用第二个收件人流之后)才会发生。
是的,要做你想做的事,你应该使用通道适配器,因为失败将直接在调用线程上运行。