【发布时间】:2016-04-30 17:32:05
【问题描述】:
假设一条 JMS 消息到达 JMS 客户端接收器中的 onMessage 方法。 Broker (IBM MQ) 在其他 JVM 上。就在那之后 - JMS 客户端的 JVM 崩溃了(在 ACKNOWLEDGE 之前)。
我正在使用客户确认。未成交。
当客户端崩溃时代理会得到一个异常(什么异常?)? 消息会留在队列中吗? 是否会重新发送消息以及何时/如何?
【问题讨论】:
假设一条 JMS 消息到达 JMS 客户端接收器中的 onMessage 方法。 Broker (IBM MQ) 在其他 JVM 上。就在那之后 - JMS 客户端的 JVM 崩溃了(在 ACKNOWLEDGE 之前)。
我正在使用客户确认。未成交。
当客户端崩溃时代理会得到一个异常(什么异常?)? 消息会留在队列中吗? 是否会重新发送消息以及何时/如何?
【问题讨论】:
首先,IBM MQ 不在 JVM 中运行。 IBM MQ 队列管理器运行时包含一堆协调的进程。
队列管理器进程会识别客户端应用程序的终止并进行清理。
当使用 CLIENT_ACKNOWLEDGE 模式时,IBM MQ JMS 客户端从 SYNC_POINT 下的队列中检索消息,因此在应用程序确认之前不会从队列中删除消息。当应用程序恢复,即调用 connection.start() 方法时,消息将被重新传递。但是,如果消息的回退计数超过回退阈值 (BOTHRESH),则不会将消息重新传递给应用程序。在这种情况下,如果已定义,消息将被移至回退队列(BOQNAME)。如果由于某种原因无法将消息移至回退队列,则消息将移至队列管理器上定义的死信队列 (DLQ)。
【讨论】: