gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:53:47 26 4
gpt4 key购买 nike

我们有一个 EIP 流程,它使用基于注释的 spring:4.2.x API、spring-integration:4.2.x API 和 spring-integration- java-dsl:1.1.0 用于从 Websphere MQ 队列接收消息、进行一些处理并最终将响应返回到另一个 Websphere MQ 队列的 API。对于此流程,我们使用 JMS 入站网关 从一个队列同步接收消息、处理它们并将响应发送回另一个队列。

JMS 入站网关 配置有 errorChannel,以便将 RuntimeException 路由到它(这工作正常)。然而,在测试期间,当我们故意对流的响应 Websphere MQ 队列应用 PUT_INHIBIT(即导致流无法将响应发送回回复队列)时,spring 日志会显示以下 WARNING日志消息:

警告 ... - JMS 消息监听器执行失败,且未设置 ErrorHandler。
javax.jms.JMSException:MQJMS2007:无法将消息发送到 MQ 队列。

我们知道我们可以通过在 MLC 本身上配置 ErrorHandler 来删除该 WARNING 日志,但是,这给我们带来问题的原因是当我们将响应路由回来时,我们实际上使用 .routeToRecipients() 调用与 .setIgnoreFailures(false) 和两个收件人进行路由 - 第一个收件人路由到 JMS 入站网关replyChannel 和到发送后流的第二个路由,以便我们可以进行数据库更新等。这里的想法是,如果第一个收件人发送失败(即当响应队列不可用时),发送后流程不会执行,而是执行错误处理流程(例如 errorChannel 流程)。但在所描述的错误场景中,我们看到警告日志,并且流程的发送后流程仍然执行,而不是 errorChannel 的流程...

此时,JMS 入站网关errorChannel 似乎不再适用。它是否正确?这是有意的行为吗?如果是,这是否意味着我们应该使用入站/出站适配器而不是入站网关来处理我们的响应发送后意图?

JMS MLC 配置:

@Bean( destroyMethod = "shutdown")
public DefaultMessageListenerContainer serviceMLC() throws Exception {

DefaultMessageListenerContainer mlc = new DefaultMessageListenerContainer();
mlc.setAutoStartup(false);
mlc.setConnectionFactory(serviceCCF);
mlc.setDestination(requestMqQueue);
mlc.setAcceptMessagesWhileStopping(false);
return mlc;
}

JMS 入站网关配置:

@Bean
public IntegrationFlow serviceFlow() {

return IntegrationFlows
.from(Jms
.inboundGateway(serviceMLC)
.autoStartup(true)
.defaultReplyDestination(responseMqQueue)
.replyChannel(responseOutCh)
.replyTimeout(180000)
.correlationKey("JMSCorrelationID")
.errorChannel(serviceErrorCh)
)
.channel(serviceInCh)
.get();
}

最佳答案

是的;网关不能那样工作。

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

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

关于java - JMS 入站网关 - 无法发送回复目标队列时的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32974678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com