JMS入站网关 - 无法回复目标队列发送时的错误处理

时间:2015-10-06 16:11:08

标签: java spring spring-integration spring-jms

我们有一个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

1 个答案:

答案 0 :(得分:1)

是;网关不会那样工作。

当您将回复发送到网关时,它将在网关中排队,直到线程返回到网关;在那个时候,回复被接收并发送。因此,发送失败直到稍后(在调用第二个收件人流之后)才会发生。

是的,要做你想做的事,你应该使用通道适配器,因为失败将直接在调用线程上运行。