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

时间:2016-02-06 15:57:33

标签: java jms messaging amqp messagebroker

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

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

  1. 客户端处理消息,确认每条消息,msg1,msg2和msg3。 >>行
  2. 知道实际行为客户端确认为批次(批量大小= 3),因此要求msg3>好的(所有消息到msg3都会被激活)
  3. 在方案1和2中,代理会收到客户端对所有3条消息的ACK的通知。并且客户端实际上还处理所有3和ACK。

    请考虑以下情况:

    一个。 msg1来到客户端。

    湾无法处理msg1。所以避免回来。 (msg1从未处理或从客户端获取)

    ℃。 msg2到来并成功处理。并确认msg2。

    因此在上面的场景中,客户端ack不保证msg1的传递。

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

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

1 个答案:

答案 0 :(得分:1)

根据规范:

  

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

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

相反,如果您发现了失败,您可以:

  1. 删除会话(甚至连接)。

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