【问题标题】:How to send IBM MQ message reliably if Destination is down?如果 Destination 已关闭,如何可靠地发送 IBM MQ 消息?
【发布时间】:2017-09-16 11:50:03
【问题描述】:

我必须向 IBM 队列发送消息。我已经编写了一个普通的生产者类来将消息推送到队列中:-

        Session session = queueConnection.createSession(true,
            QueueSession.AUTO_ACKNOWLEDGE);
        Destination destination =
            session.createQueue("test.queue");
        MessageProducer producer = session.createProducer(destination);

            TextMessage message = session.createTextMessage("test");
            producer.send(message);

        // Close the session
        session.close();

现在,假设由于某种原因,QueueManager 中存在的队列已关闭,或者 IBM MQ 代理已关闭,或者存在导致发送消息失败的网络问题。

JMS/IBM MQ 中是否有一种机制可以自动重试以发送消息(基本上是重试机制)并在最终放弃将消息发送到 IBM MQ 代理之前重试一些定义的次数?

【问题讨论】:

    标签: jms ibm-mq


    【解决方案1】:

    IBM MQ JMS 客户端(也包括其他 IBM MQ 客户端)具有一个功能,如果连接 IBM MQ 队列管理器由于任何原因中断,客户端会尝试重新连接到队列管理器,直到指定的时间量。见这里:https://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q032520_.htm。您需要配置连接工厂以启用重新连接。

    例如,如果在执行producer.send 方法时与队列管理器的连接中断,IBM MQ JMS 客户端会自动尝试重新连接到队列管理器并发送消息。

    在 IBM MQ 中,队列不能关闭,但它可能会变得不可访问,例如,如果队列已满或 put/get on queue 已禁用等。

    【讨论】:

    • 感谢您指向链接。但我的用例是应用程序将在 TOMEE 容器内运行。如果由于某种原因队列不可用,在 TOMEE 中运行的应用程序是否能够使用 setClientReconnectOptions 自动重新连接?
    • 是的,如果您启用了重新连接选项并且连接中断,MQ JMS 客户端将尝试重新连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2021-08-17
    • 2021-06-15
    • 2013-07-11
    相关资源
    最近更新 更多