2015-05-29 56 views
2

JMS API将我驱动到精神崩溃的地步。轮询jms队列的消息并明确确认每条消息已被正确处理的正确方法是什么?JMS - 如何正确实现消息接收器与明确的确认?

我应该在上述场景中创建一个“事务处理会话”以及哪种确认模式是正确的?

我的设计约束:

  1. 重复传送是没有问题
  2. 性能不是主要关心的问题
  3. 在地板上删除邮件是不能接受的
  4. 我宁愿不添加一个依赖Spring-JMS

回答

1

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

DUPS_OK_ACKNOWLEDGE - 如果JMS提供程序发生故障,会自动对消息进行自动延迟确认,这可能会导致重复消息。

AUTO_ACKNOWLEDGE - 客户端应用程序明确承认消息 - 当消息被传递到应用

CLIENT_ACKNOWLEDGE会话自动确认。

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

您拥有的其他选项是使用确认模式无效的事务处理会话。在事务处理会话中,仅当应用程序调用commit时才会从队列中删除消息。如果会话呼叫rollback或结束呼叫commit,则自上一次commit呼叫以来传送到应用程序的所有消息都将重新出现在队列中。