在 jms (v1.0) 订阅者客户端 ack 模式中,message.acknowledge() 是将 ack 发送回服务器(代理)端的唯一方法。实际行为是,如果客户端确认消息 3,则消息发送者(代理)客户端确认直到消息 3[1] 的所有消息。
即 msg1、msg2、msg3按顺序传递给客户端。
- 客户端为每条消息(msg1、msg2 和 msg3)处理消息 ACK。 >> 好的
- 了解客户端批量确认的实际行为(批量大小 = 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 中不再确认任何消息。
相反,如果您检测到故障,您可以:
关于java - JMS 客户端确认模式下的保证交付如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243053/