在Java中获取MQ队列统计信息

时间:2012-01-30 17:01:02

标签: java statistics ibm-mq

从我的应用程序中,我需要查询一些Websphere MQ每队列统计信息(最后消息获取/放置时间,en / dequeued消息数,当前队列深度,连接客户端数)。 我设法通过PCFAgent获得队列深度,但我有点坚持其余,因为IBM文档相当混乱。

您是否知道可能有用的任何有用的参考(或代码示例)?

1 个答案:

答案 0 :(得分: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版本。

<强>更新

以下是执行所请求功能的一些代码段:

首先,您需要一个队列管理器连接(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时间,您需要打开队列监控(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 });

您可以使用以下方式检索参数:

pcfResp = pcfAgent.send(inquireQueueStatus);

对于每个单独的parms,您可以使用getXXXXXParameterValue方法(XXXXXX是数据类型)。

对于Enq / 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);

如果您有更多问题,请与我们联系。