JMS - 如何正确实现具有显式确认的消息接收器?

时间:2015-05-29 07:09:35

标签: java jms

JMS API让我陷入精神崩溃的境地。轮询jms队列消息的正确方法是什么,并明确承认每条消息都已正确处理?

我应该创建一个"交易会话"哪种确认模式在上述场景中是正确的?

我的设计限制:

  1. 重复发送没问题
  2. 表现不是主要问题
  3. 不接受在地板上删除消息
  4. 我宁愿不向Spring-JMS添加依赖

1 个答案:

答案 0 :(得分:1)

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

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

AUTO_ACKNOWLEDGE - 会话自动确认何时将消息传递给应用程序

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

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

您拥有的另一个选项是使用交易会话,其中确认模式无效。在事务会话中,仅当应用程序调用{​​{1}}时才会从队列中删除消息。如果会话调用commit或在不调用rollback的情况下结束,则自上次commit调用以来传递到应用程序的所有邮件都将重新出现在队列中。