java - JMS 客户端确认模式下的保证交付如何工作?

标签 java jms messaging amqp messagebroker

在 jms (v1.0) 订阅者客户端 ack 模式中,message.acknowledge() 是将 ack 发送回服务器(代理)端的唯一方法。实际行为是,如果客户端确认消息 3,则消息发送者(代理)客户端确认直到消息 3[1] 的所有消息。

即 msg1、msg2、msg3按顺序传递给客户端。

  1. 客户端为每条消息(msg1、msg2 和 msg3)处理消息 ACK。 >> 好的
  2. 了解客户端批量确认的实际行为(批量大小 = 3),因此要求 msg3 > OK(msg3 之前的所有消息都得到确认)

在场景 1 和 2 中,代理收到客户端 ACK 已发送的所有 3 条消息的通知。客户端实际上也处理了所有 3 个并返回 ACK。

考虑以下场景:

a. msg1 到达客户端。

b.处理 msg1 失败。所以避免回复。 (msg1 从未从客户端处理或确认)

c. msg2 到来并成功处理。并确认 msg2。

因此在上述场景中客户端ack并不能保证msg1的传送。

请解释一下,当通过 JMS 1.0 规范使用客户端确认进行批处理时,是否有解决方法可以保证交付。

[1] http://docs.oracle.com/javaee/7/api/javax/jms/Message.html#acknowledge

最佳答案

根据规范:

By invoking acknowledge on a consumed message, a client acknowledges all messages consumed by the session that the message was delivered to.

因此,协议(protocol)是在消息失败的 session 中不再确认任何消息。

相反,如果您检测到故障,您可以:

  1. 拆除 session (甚至连接)。

  2. 调用recover在您的Session上。这将使用最旧的未确认消息重新启动消息传递。

关于java - JMS 客户端确认模式下的保证交付如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243053/

相关文章:

java - 发布/订阅范式 : Can I know if subscribers are alive?

android - 为什么 TTakePhotoFromCameraAction.OnDidFinishTaking 事件在 Android 10 上不起作用?

java - 订阅 Observable 而不触发它然后传递它

用于验证电话号码的 Java 正则表达式

jms - 低延迟消息队列

java - 如何将 JMS 与 PHP 结合使用?

java - 生成绑定(bind)文件 Message Queue Broker 4.5

javascript - Chrome扩展异步问题

java - 使用 Docker 时的 Spring Boot 外部配置

java - 加密连接字符串,如何加密?