在我的應用程序中,我需要查詢某些Websphere MQ每隊列統計信息(最後一條消息的get/put時間,en /出隊消息的數量,當前隊列深度,連接客戶端的數量)。 我設法通過PCFAgent獲得了隊列深度,但是我有點困惑,因爲IBM文檔相當混亂。在Java中獲取MQ隊列統計信息
您是否知道可能有幫助的任何有用的參考資料(或代碼示例)?
在我的應用程序中,我需要查詢某些Websphere MQ每隊列統計信息(最後一條消息的get/put時間,en /出隊消息的數量,當前隊列深度,連接客戶端的數量)。 我設法通過PCFAgent獲得了隊列深度,但是我有點困惑,因爲IBM文檔相當混亂。在Java中獲取MQ隊列統計信息
您是否知道可能有幫助的任何有用的參考資料(或代碼示例)?
如果您將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);
讓我知道如果您有更多問題。
ListQueueDepth示例是我已經用於獲取隊列深度的示例。不幸的是,似乎沒有涵蓋我需要的其他統計數據的樣本(最後消息獲取/放置時間,入/出隊消息數量,連接的客戶端數量)。 – CAFxX 2012-01-31 09:23:08
感謝您的詳盡回覆! enq/deq數量太糟糕了,需要重新設置統計數據,這是一個不爭的事實。 – CAFxX 2012-02-15 13:27:42
我把這稱爲「WMQ的量子API調用」:觀察值的行爲改變了這個值。我從來都不喜歡這種行爲。如果你想申請一個新的功能「查詢隊列統計」,請使用WMQ請求表格http://bit.ly/WMQReq – 2012-02-15 13:59:34