保证传递在 JMS 客户端确认模式下的工作原理



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

即消息 1、MSG2、msg3 按顺序传递到客户端。

  1. 客户端处理每条消息的消息 ACK,消息 1、消息 2 和消息 3。>> 确定
  2. 知道客户端的实际行为以批处理形式确认(批处理大小= 3(,因此要求msg3>确定(直到msg3的所有消息都会被确认(

在场景 1 和场景 2 中,代理收到客户端 ACK 到所有 3 条消息传递的通知。并且客户端实际上还处理所有 3 和 ACK 回来。

请考虑以下方案:

答:味精1来到客户端。

b. 无法处理消息 1。所以避免回头。(msg1 从未从客户端处理或确认(

C. 味精 2 来并成功处理。并咳出味精2。

因此,在上述场景中,客户端 ack 不保证 msg1 的交付。

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

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

根据规范:

通过对使用的消息调用确认,客户端确认消息传递到的会话使用的所有消息。

因此,交易是在消息失败的会话中不再确认任何消息。

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

  1. 拆除会话(甚至连接(。

  2. 在会话上调用恢复。这将使用最早的未确认消息重新启动消息传递。

最新更新