Spring JMS 和 ActiveMQ Artemis:管理同步消息的超时

问题描述 投票:0回答:1

我有一个使用 JMS 进行通信的巨大应用程序。不幸的是,目前所有消息都是同步的,我们使用方法

JmsTemplate#sendAndReceive

好吧,它有效了!但是....

如果超时,生产者将按预期关闭临时队列(定义为接收响应)。但是当监听器结束处理时,它将重新创建临时队列来发送响应。该队列是临时的(没有消费者),但地址也没有标记为临时的。

结果是我们有多个地址和队列等待消费者处理响应,而这种情况永远不会发生。

如果(原始消息的)生产者之前关闭了临时队列并且不再等待,如何防止重新创建临时队列?

编辑:我正在使用 Artemis 2.29.0,但我与最新版本 2.31.0 具有相同的行为

java spring-jms activemq-artemis
1个回答
0
投票

在同步通信模式的许多用例中,在请求者停止等待之后,服务提供者的响应就不再具有任何价值。我相信你描述了这样一个用例。那么设置请求消息的生存时间就有意义了:

JMSTemplate.setTimeToLive(long timeToLiveInMs)

将其设置为与您的超时相对应的值。如果服务提供者消费请求存在延迟,则消息大约在您停止等待响应时过期,因此服务提供者将不再费心处理该请求,因此不会发送多余的消息回复。除非您未在地址设置中指定过期地址,否则过期消息将被删除。

这可能无法消除冗余响应的每种情况,例如,及时创建响应,但将其传输到应用程序时存在延迟,或者因为您的应用程序在超时间隔期间关闭。因此,服务提供商应该将请求消息的生存时间值传播到响应消息。我同意您的评论,不应允许服务提供商重新创建响应队列。随着时间的推移,这些尝试的发生次数将会减少。

© www.soinside.com 2019 - 2024. All rights reserved.