JMS - 如何使用显式确认正确实现消息接收器?
JMS - How to correctly implement message receiver with explicit acknowledge?
JMS API 快把我逼到精神崩溃的地步了。轮询 jms 队列的消息并明确确认每条消息都已正确处理的正确方法是什么?
我应该创建一个 "transacted session" 并且在上述情况下哪种确认模式是正确的?
我的设计限制:
- 重复投递没问题
- 性能不是主要问题
- 不允许将消息丢在地上
- 我不想向 Spring-JMS 添加依赖项
JMS中有3种消息确认类型:
DUPS_OK_ACKNOWLEDGE
- 会话自动但延迟确认消息,如果 JMS 提供程序失败,可能会导致重复消息。
AUTO_ACKNOWLEDGE
- 当消息传送到应用程序时会话自动确认
CLIENT_ACKNOWLEDGE
- 客户端应用程序明确确认消息。
根据您的要求,我认为您可以选择 CLIENT_ACKNOWLEDGE
,因为它允许您的应用程序明确确认消息。但您必须注意,在某些 JMS 提供程序中,确认已使用的消息会自动确认已收到其会话已传送的所有消息。然而,一些 JMS 提供程序确实实现了每条消息的确认。
您的另一个选择是使用确认模式无效的事务处理会话。在事务处理会话中,仅当应用程序调用 commit
时才会从队列中删除消息。如果会话调用 rollback
或未调用 commit
就结束,自上次 commit
调用以来传递到应用程序的所有消息将重新出现在队列中。
JMS API 快把我逼到精神崩溃的地步了。轮询 jms 队列的消息并明确确认每条消息都已正确处理的正确方法是什么?
我应该创建一个 "transacted session" 并且在上述情况下哪种确认模式是正确的?
我的设计限制:
- 重复投递没问题
- 性能不是主要问题
- 不允许将消息丢在地上
- 我不想向 Spring-JMS 添加依赖项
JMS中有3种消息确认类型:
DUPS_OK_ACKNOWLEDGE
- 会话自动但延迟确认消息,如果 JMS 提供程序失败,可能会导致重复消息。
AUTO_ACKNOWLEDGE
- 当消息传送到应用程序时会话自动确认
CLIENT_ACKNOWLEDGE
- 客户端应用程序明确确认消息。
根据您的要求,我认为您可以选择 CLIENT_ACKNOWLEDGE
,因为它允许您的应用程序明确确认消息。但您必须注意,在某些 JMS 提供程序中,确认已使用的消息会自动确认已收到其会话已传送的所有消息。然而,一些 JMS 提供程序确实实现了每条消息的确认。
您的另一个选择是使用确认模式无效的事务处理会话。在事务处理会话中,仅当应用程序调用 commit
时才会从队列中删除消息。如果会话调用 rollback
或未调用 commit
就结束,自上次 commit
调用以来传递到应用程序的所有消息将重新出现在队列中。