java - JMS - 如何使用显式确认正确实现消息接收器?

标签 java jms

JMS API 快让我精神崩溃了。轮询 jms 队列的消息并明确确认每条消息已被正确处理的正确方法是什么?

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

我的设计限制:

  1. 重复投递没问题
  2. 性能不是主要问题
  3. 不允许将信息掉在地上
  4. 我宁愿不添加对 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/

相关文章:

java - @RespositoryRestController 中的空身份验证@WithUserDetails

java - 重复的局部变量 session (javax.jms.Session)

java - aqapi13.jar 的 Maven 依赖项

java - 如何让JMS消息发送到MQ以完全提交?

java - 尝试在 jpa 表上创建新条目时出错

java - 使用磁传感器

java - 如何在 MappingJackson2MessageConverter 中设置 typeIdPropertyName

amazon-web-services - 带有 SQS 提供程序的 JMS MessageListener 的轮询间隔

Java - 在不使用内部迭代器类的情况下实现自定义 Iterable

java - 我们可以检查 hibernate 条件别名是否已经存在?