JMS API将我驱动到精神崩溃的地步。轮询jms队列的消息并明确确认每条消息已被正确处理的正确方法是什么?JMS - 如何正确实现消息接收器与明确的确认?
我应该在上述场景中创建一个“事务处理会话”以及哪种确认模式是正确的?
我的设计约束:
- 重复传送是没有问题
- 性能不是主要关心的问题
- 在地板上删除邮件是不能接受的
- 我宁愿不添加一个依赖Spring-JMS
JMS API将我驱动到精神崩溃的地步。轮询jms队列的消息并明确确认每条消息已被正确处理的正确方法是什么?JMS - 如何正确实现消息接收器与明确的确认?
我应该在上述场景中创建一个“事务处理会话”以及哪种确认模式是正确的?
我的设计约束:
JMS中有3种类型的消息确认类型:
DUPS_OK_ACKNOWLEDGE
- 如果JMS提供程序发生故障,会自动对消息进行自动延迟确认,这可能会导致重复消息。
AUTO_ACKNOWLEDGE
- 客户端应用程序明确承认消息 - 当消息被传递到应用
CLIENT_ACKNOWLEDGE
会话自动确认。
根据您的要求,我认为您可以选择CLIENT_ACKNOWLEDGE
,因为它允许您的应用程序明确确认消息。但是您必须注意,在某些JMS提供程序中,确认消费的消息会自动确认收到其会话已传递的所有消息。但是,一些JMS提供者确实实现了每个消息确认。
您拥有的其他选项是使用确认模式无效的事务处理会话。在事务处理会话中,仅当应用程序调用commit
时才会从队列中删除消息。如果会话呼叫rollback
或结束呼叫commit
,则自上一次commit
呼叫以来传送到应用程序的所有消息都将重新出现在队列中。