【问题标题】:Remove a Message from IBM MQQueue从 IBM MQQueue 中移除消息
【发布时间】:2014-03-04 19:19:23
【问题描述】:

我正在开发一些 IBM MQ 队列的监控应用程序。我正在尝试实现一种可以将所有消息从一个队列传输到另一个队列的方式。 get(msg) 方法会从队列中删除消息吗?或者它只会检索它的副本?

这是我的代码:

private void moveMessages(String qName, String moveToThisQ) {
    try {
        MQQueue q = qm.accessQueue(qName, MQConstants.MQOO_INQUIRE);
        MQQueue qMoveHere = qm.accessQueue(moveToThisQ,
                MQConstants.MQOO_INQUIRE);
        while (q.getCurrentDepth() != 0) {
            MQMessage msg = new MQMessage();
            q.get(msg);
            qMoveHere.put(msg);
        }
        if (q != null)
            q.close();
        if (qMoveHere != null)
            qMoveHere.close();
    } catch (MQException e) {
        e.printStackTrace();
    }
}

如果有人可以提供有关 get(msg) 对队列的影响的任何见解?从我看过的示例中,我可能必须将一个选项与 get 方法一起传递?也许不吧?!

【问题讨论】:

  • 我希望这段代码不适用于生产系统!如果您尝试清空队列,请循环直到 GET 返回原因代码 2033。正如 roger 指出的那样,检查深度对于您的目的而言并不可靠。此外,请务必在同步点下执行 GET 和 PUT,除非您准备冒丢失消息的风险。以这种方式编写,您很容易丢失消息。例如,如果目标队列已满,则在 PUT 上收到该错误之前从源队列获取的最后一条消息是 toast。

标签: java ibm-mq


【解决方案1】:

while (q.getCurrentDepth() != 0)

永远不要在 MQ 中这样做。一条消息可能在队列中,但您的应用程序尚不可用,是的,当前深度将大于 1。

此外,执行您正在执行的操作不会将信息保留在 MQMD 标头中。大多数字段将在看跌期权上重新初始化。去手册中查找 MQOO_PASS_ALL_CONTEXT 和 MQOO_SAVE_ALL_CONTEXT。

【讨论】:

    【解决方案2】:

    是的。 get() 从队列中删除消息,除非您在 accessQueue() 方法中指定了 MQConstants.MQOO_BROWSE。

    API 文档如下。在 accessQueue() 方法中查找 openOptionsArg。 http://pic.dhe.ibm.com/infocenter/wmqv7/v7r5/index.jsp?topic=%2Fcom.ibm.mq.javadoc.doc%2FWMQJavaClasses%2Fcom%2Fibm%2Fmq%2FMQQueueManager.html

    【讨论】:

      【解决方案3】:

      您能否提供更多关于您要监控的内容的详细信息? WebSphere MQ 已经提供了监控队列的方法,例如,您可以监控队列深度的高/低/满、记帐和统计等。如果您正在寻找这些功能,您可以使用现有的监控功能而不是自己编写。

      您可以在 WebSphere MQ 监控上找到详细描述 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        • 2012-08-27
        • 2019-09-02
        • 1970-01-01
        相关资源
        最近更新 更多