2012-01-30 39 views
4

在我的應用程序中,我需要查詢某些Websphere MQ每隊列統計信息(最後一條消息的get/put時間,en /出隊消息的數量,當前隊列深度,連接客戶端的數量)。 我設法通過PCFAgent獲得了隊列深度,但是我有點困惑,因爲IBM文檔相當混亂。在Java中獲取MQ隊列統計信息

您是否知道可能有幫助的任何有用的參考資料(或代碼示例)?

回答

9

如果您將WMQ客戶端安裝在默認位置,則樣本將位於:C:\Program Files (x86)\IBM\WebSphere MQ\tools\pcf\samples

在UNIX上,它們最終在/opt/mqm/samp之下。

如果您只抓取了jar文件並且沒有安裝客戶端,那麼您將不會獲得受支持的配置 - 或樣本,跟蹤實用程序,診斷工具等等。客戶端安裝媒體可免費使用在SupportPacs page下載。目前可用的不同的客戶有:

確保您正在Infocenter中查看要連接到的WebSphere MQ Server版本。另請注意,如果您連接到v7 QMgr並使用v6客戶端,那麼您使用的常量和類將限制您使用v6功能。最好使用最新的客戶端,因爲它始終向後兼容較早的QMgr版本。

UPDATE:

這裏有一些代碼片段執行所請求的功能:

首先你需要一個隊列管理器連接(qmgr)。然後,你可以創建一個PCFMessageAgent

// Create PCF Message Agent 
try { 
    pcfAgent = new PCFMessageAgent(qmgr); 
} catch (MQException mqe) { 
    System.err.println("PCF Message Agent creation ended with reason code " 
         + mqe.reasonCode); 
    return mqe.reasonCode; 
} 

你可以得到最需要使用的屬性(除ENQ/DEQ數)以下的電話的。請注意,爲了獲得最後一個msg get \ put time,您需要打開隊列監視(MONQ)。

// Prepare PCF command to inquire queue status (status type) 
inquireQueueStatus = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_STATUS); 
inquireQueueStatus.addParameter(CMQC.MQCA_Q_NAME, "name of queue to inquire"); 
inquireQueueStatus.addParameter(CMQCFC.MQIACF_Q_STATUS_TYPE, CMQCFC.MQIACF_Q_STATUS); 
inquireQueueStatus.addParameter(CMQCFC.MQIACF_Q_STATUS_ATTRS, new int[] { 
        CMQC.MQCA_Q_NAME, CMQC.MQIA_CURRENT_Q_DEPTH, 
        CMQCFC.MQCACF_LAST_GET_DATE, CMQCFC.MQCACF_LAST_GET_TIME, 
        CMQCFC.MQCACF_LAST_PUT_DATE, CMQCFC.MQCACF_LAST_PUT_TIME, 
        CMQCFC.MQIACF_OLDEST_MSG_AGE, CMQC.MQIA_OPEN_INPUT_COUNT, 
        CMQC.MQIA_OPEN_OUTPUT_COUNT, CMQCFC.MQIACF_UNCOMMITTED_MSGS }); 

可以使用檢索PARMS:

pcfResp = pcfAgent.send(inquireQueueStatus); 

的每一個人PARMS可以使用getXXXXXParameterValue方法(XXXXXX是數據類型)。

對於的查詢/ DEQ計數,您需要重置隊列統計:

// Prepare PCF command to reset queue statistics 
queueResetStats = new PCFMessage(CMQCFC.MQCMD_RESET_Q_STATS); 
queueResetStats.addParameter(CMQC.MQCA_Q_NAME, queueName); 

pcfResp3 = pcfAgent.send(queueResetStats); 

queueMsgDeqCount = pcfResp3[0].getIntParameterValue(CMQC.MQIA_MSG_DEQ_COUNT); 
queueMsgEnqCount = pcfResp3[0].getIntParameterValue(CMQC.MQIA_MSG_ENQ_COUNT); 

讓我知道如果您有更多問題。

+0

ListQueueDepth示例是我已經用於獲取隊列深度的示例。不幸的是,似乎沒有涵蓋我需要的其他統計數據的樣本(最後消息獲取/放置時間,入/出隊消息數量,連接的客戶端數量)。 – CAFxX 2012-01-31 09:23:08

+1

感謝您的詳盡回覆! enq/deq數量太糟糕了,需要重新設置統計數據,這是一個不爭的事實。 – CAFxX 2012-02-15 13:27:42

+1

我把這稱爲「WMQ的量子API調用」:觀察值的行爲改變了這個值。我從來都不喜歡這種行爲。如果你想申請一個新的功能「查詢隊列統計」,請使用WMQ請求表格http://bit.ly/WMQReq – 2012-02-15 13:59:34