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

How guaranteed delivery works in JMS client acknowledgment mode?

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

即 msg1, msg2, msg3 按顺序发送给客户端。

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

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

考虑以下场景:

一个。 msg1 到达客户端。

b。无法处理 msg1。所以避免 ack 返回。 (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.

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

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

  1. 关闭会话(甚至连接)。

  2. 调用 recover on your Session。这将使用最早的未确认消息重新开始消息传递。