【问题标题】:JMS client's JVM crushed - CLIENT ACKNOWLEDGE modeJMS 客户端的 JVM 崩溃 - CLIENT ACKNOWLEDGE 模式
【发布时间】:2016-04-30 17:32:05
【问题描述】:

假设一条 JMS 消息到达 JMS 客户端接收器中的 onMessage 方法。 Broker (IBM MQ) 在其他 JVM 上。就在那之后 - JMS 客户端的 JVM 崩溃了(在 ACKNOWLEDGE 之前)。

我正在使用客户确认。未成交。

当客户端崩溃时代理会得到一个异常(什么异常?)? 消息会留在队列中吗? 是否会重新发送消息以及何时/如何?

【问题讨论】:

    标签: java jms ibm-mq


    【解决方案1】:

    首先,IBM MQ 不在 JVM 中运行。 IBM MQ 队列管理器运行时包含一堆协调的进程。

    队列管理器进程会识别客户端应用程序的终止并进行清理。

    当使用 CLIENT_ACKNOWLEDGE 模式时,IBM MQ JMS 客户端从 SYNC_POINT 下的队列中检索消息,因此在应用程序确认之前不会从队列中删除消息。当应用程序恢复,即调用 connection.start() 方法时,消息将被重新传递。但是,如果消息的回退计数超过回退阈值 (BOTHRESH),则不会将消息重新传递给应用程序。在这种情况下,如果已定义,消息将被移至回退队列(BOQNAME)。如果由于某种原因无法将消息移至回退队列,则消息将移至队列管理器上定义的死信队列 (DLQ)。

    【讨论】:

    • 我正在使用带有连接池的 spring jms 。所以连接不是关闭/打开每条消息。每条消息都有一个新会话。所以在一条消息未被确认后,它不会重新发送,直到我重新启动我的应用程序?这还不够好.. 如果队列中有未传递的消息,也许有一种方法可以检查每条到达的消息,并要求传递它们?
    • 由于消息是使用 CLIENT_ACKNOWLEDGE 模式接收的,因此必须确认它才能从队列中删除。如果未确认且应用程序未调用 session.close() 方法,则消息对其他消费者不可见,因此无法传递给其他消费者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多