JMS - 如何使用显式确认正确实现消息接收器?

JMS - How to correctly implement message receiver with explicit acknowledge?

JMS API 快把我逼到精神崩溃的地步了。轮询 jms 队列的消息并明确确认每条消息都已正确处理的正确方法是什么?

我应该创建一个 "transacted session" 并且在上述情况下哪种确认模式是正确的?

我的设计限制:

  1. 重复投递没问题
  2. 性能不是主要问题
  3. 不允许将消息丢在地上
  4. 我不想向 Spring-JMS 添加依赖项

JMS中有3种消息确认类型:

DUPS_OK_ACKNOWLEDGE - 会话自动但延迟确认消息,如果 JMS 提供程序失败,可能会导致重复消息。

AUTO_ACKNOWLEDGE - 当消息传送到应用程序时会话自动确认

CLIENT_ACKNOWLEDGE - 客户端应用程序明确确认消息。

根据您的要求,我认为您可以选择 CLIENT_ACKNOWLEDGE,因为它允许您的应用程序明确确认消息。但您必须注意,在某些 JMS 提供程序中,确认已使用的消息会自动确认已收到其会话已传送的所有消息。然而,一些 JMS 提供程序确实实现了每条消息的确认。

您的另一个选择是使用确认模式无效的事务处理会话。在事务处理会话中,仅当应用程序调用 commit 时才会从队列中删除消息。如果会话调用 rollback 或未调用 commit 就结束,自上次 commit 调用以来传递到应用程序的所有消息将重新出现在队列中。