gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:28:15 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com