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