【发布时间】: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。