2014-03-04 187 views
0

我正在爲某些IBM MQ隊列的監視器應用程序工作。我試圖實現一種方式,我可以將所有消息從一個隊列傳輸到另一個隊列。 get(msg)方法是否會從隊列中刪除消息?或者它只是檢索它的副本?從IBM MQQueue刪除消息

這裏是我的代碼:

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

我希望這段代碼不適用於生產系統!如果您嘗試清空隊列,請循環,直到GET返回2033的原因代碼。正如羅傑指出的那樣,檢查深度對您而言並不可靠。另外,除非你準備冒失去的風險,否則一定要在同步點下進行GET和PUT。這是寫的方式,你很容易失去信息。例如,如果目標隊列填滿,則在PUT上獲取該錯誤之前從源隊列獲取的最後一條消息是吐司。 –

回答

1

你能提供一些你想要監視什麼的細節嗎? WebSphere MQ已經提供了監控隊列的方法,例如,您可以監控隊列深度高/低/滿,記帳和統計等。如果您正在尋找的是您自己的,那麼您可以使用現有的監控功能,而不用編寫自己的監控功能。

您可以在WebSphere MQ監視上找到有關here的詳細描述。

2

而(q.getCurrentDepth()!= 0)

永遠不要爲此在MQ。一條消息可能在隊列中,但目前尚未提供給您的應用程序,是的,當前深度將大於1.

此外,您正在做的事情不會將信息保留在MQMD標題中。大部分字段將在通話中重新初始化。請查閱手冊中的MQOO_PASS_ALL_CONTEXT和MQOO_SAVE_ALL_CONTEXT。