在没有确认的情况下实施 Spring JMSTemplate

Implement Spring JMSTemplate without acknowledgement

我们有一个要求是构建 spring 引导命令行应用程序,我们必须在其中将消息发送到队列。

只设置了请求队列。 由于没有响应队列设置,无论客户端是否收到消息,我们都不会得到任何确认。 现在我正在使用 Spring 的 JMSTemplate send() 方法将消息发送到请求队列,并使用 SingleConnectionFactory 创建一个共享连接,因为这是命令行应用程序

由于我们发送到请求队列的消息没有acknowledgement/response,因此端到端测试很困难。 如果destination/request获取到队列连接且消息发送无异常,则认为测试成功

仅实施 Spring JMS 模板 send() 方法是否正确?并且不遵循 jms 模板 send/receive 模式

注意:无法设置响应队列并从客户端获得任何确认。

在 JMS(以及大多数其他消息系统)中,生产者和消费者在逻辑上是分离的(即解耦)。这是系统基本设计的一部分,旨在降低复杂性并提高可扩展性。有了这些限制,您的生产者不应该关心消息是否被消费。生产者只是发送消息。同样,消费者不应该关心谁发送消息或多久发送一次消息等。他们的工作只是消费消息。

假设您的应用程序实际上对消息做某事(即消息处理有某种功能输出)那么这就是您的端到端测试应该做的措施。如果你得到了你正在寻找的最终结果,那么你可以推断出之间的步骤(例如发送消息、接收消息等)已成功完成。

明确地说,在不使用 request/response 模式的情况下使用 Spring 的 JMSTemplate 发送消息是完全可以的。一般来说,如果没有异常,则表示消息发送成功。但是,在使用 JMSTemplate 时还有其他注意事项。例如,Spring's JavaDoc 表示:

The ConnectionFactory used with this template should return pooled Connections (or a single shared Connection) as well as pooled Sessions and MessageProducers. Otherwise, performance of ad-hoc JMS operations is going to suffer.

也就是说,了解特定 JMS 客户端实现的行为很重要。许多实现将异步发送非持久性 JMS 消息(即触发后忘记),这意味着它们可能无法到达代理 并且 客户端不会抛出异常。发送持久消息通常足以保证客户端在出现任何问题时抛出异常,但请查阅您的客户端实现文档以确认。