JMS API 快让我精神崩溃了。轮询 jms 队列的消息并明确确认每条消息已被正确处理的正确方法是什么?
我应该创建一个“事务处理 session ”吗?在上述场景中,哪种确认模式是正确的?
我的设计限制:
- 重复投递没问题
- 性能不是主要问题
- 不允许将信息掉在地上
- 我宁愿不添加对 Spring-JMS 的依赖
最佳答案
JMS中有3种消息确认类型:
DUPS_OK_ACKNOWLEDGE
- session 自动但延迟确认消息,如果 JMS 提供程序失败,可能会导致重复消息。
AUTO_ACKNOWLEDGE
- 当消息传递给应用程序时 session 自动确认
CLIENT_ACKNOWLEDGE
- 客户端应用程序明确确认消息。
根据您的要求,我认为您可以选择 CLIENT_ACKNOWLEDGE
,因为它允许您的应用程序明确确认消息。但您必须注意,在某些 JMS 提供程序中,确认已使用的消息会自动确认已收到其 session 已传送的所有消息。然而,一些 JMS 提供程序确实实现了每条消息的确认。
您的另一个选择是使用确认模式无效的事务处理 session 。在事务处理 session 中,只有当应用程序调用 commit
时,消息才会从队列中删除。如果 session 调用 rollback
或在未调用 commit
的情况下结束,则自上次 commit
调用以来传递到应用程序的所有消息将重新出现在队列中.
关于java - JMS - 如何使用显式确认正确实现消息接收器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30523313/