【问题标题】:Implement Spring JMSTemplate without acknowledgement在没有确认的情况下实现 Spring JMSTemplate
【发布时间】:2021-07-19 15:39:21
【问题描述】:

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

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

由于我们发送到请求队列的消息没有确认/响应,因此端到端测试很困难。 如果获取到destination/request queue连接,并且消息发送无任何异常,我认为这是一个成功的测试。

是否只实现 Spring JMS 模板 send() 方法?并且不遵循 jms 模板发送/接收模式

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

【问题讨论】:

  • 在 Stack Overflow 上提出关于“更好的设计”的问题确实是题外话,因为它会导致基于意见的答案和讨论,而不是基于事实的答案。我鼓励您重新表述您的问题,使其更加具体和具体。
  • 是的,但我一直在各种项目中看到带有发送-接收架构的 jms 模板。所以我想检查一下设计是否可以只实现发送功能
  • 那么你应该在你的问题中更清楚地说明这一点。同样,要求“更好的设计”是题外话。
  • 根据您的建议编辑了问题

标签: message-queue spring-jms


【解决方案1】:

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

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

明确地说,使用 Spring 的 JMSTemplate 发送消息而不使用请求/响应模式是完全可以的。一般来说,如果您没有收到异常,则表示消息已成功发送。但是,使用 JMSTemplate 时还有其他注意事项。例如,Spring's JavaDoc 是这样说的:

与此模板一起使用的 ConnectionFactory 应返回池连接(或单个共享连接)以及池会话和消息生产者。否则,临时 JMS 操作的性能将会受到影响。

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

【讨论】:

  • 我们使用一些业务逻辑准备消息并将其发送到队列。消费者收到的确认/响应/输出消息将不做任何处理。确认只是为了确保消费者收到消息并确认相同。所以我的理解是,在我们的具体情况下,我们可以只使用 JMS 模板发送方法(因为只有请求队列可用)并且对于端到端测试,我们可以检查消息是否被发送到队列而没有任何例外。对吗?
  • 所以你发送的消息被消费了,但消费者实际上并没有对消息做任何事情?
  • 不,我们发送被消费的消息,但是如果我们从消费者那里得到响应/确认,我们发送该消费者收到的消息,我们将不会进一步使用该确认。那么只实现jms模板发送机制是否可行?
  • 我更新了我的答案以解决您的评论。我希望这会有所帮助。
猜你喜欢
  • 2015-04-13
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2013-10-15
相关资源
最近更新 更多