在我的应用程序中,我需要查询某些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