从IBM MQQueue中删除消息

时间:2014-03-04 19:19:24

标签: java ibm-mq

我正在为一些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方法?也许不吧?!

3 个答案:

答案 0 :(得分:2)

  

while(q.getCurrentDepth()!= 0)

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

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

答案 1 :(得分:1)

是。 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

答案 2 :(得分:1)

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

您可以在WebSphere MQ监视中找到详细说明here