【问题标题】:Getting MQ queue statistics in Java在 Java 中获取 MQ 队列统计信息
【发布时间】:2012-02-22 11:17:39
【问题描述】:

从我的应用程序中,我需要查询一些 Websphere MQ 每个队列的统计信息(最后一条消息获取/放置时间、en/dequeued 消息的数量、当前队列深度、连接的客户端数量)。 我设法通过 PCFAgent 获得了队列深度,但由于 IBM 文档相当混乱,所以我有点卡住了。

您知道任何有用的参考资料(或代码示例)吗?

【问题讨论】:

    标签: java statistics ibm-mq


    【解决方案1】:

    如果您将 WMQ 客户端安装在默认位置,则示例将位于:C:\Program Files (x86)\IBM\WebSphere MQ\tools\pcf\samples

    在 UNIX 风格上,它们最终在 /opt/mqm/samp 下。

    如果您只是获取 jar 文件并且没有安装客户端,那么您将没有受支持的配置 - 或者示例、跟踪实用程序、诊断工具等。客户端安装媒体可免费下载在SupportPacs page。目前可用的不同客户端有:

    确保您正在查看信息中心以了解您要连接到的 WebSphere MQ Server 版本。另请注意,如果您连接到 v7 QMgr 并使用 v6 客户端,那么您使用的常量和类将限制您使用 v6 功能。最好使用最新的客户端,因为它始终向后兼容旧的 QMgr 版本。

    更新:

    这里有一些代码 sn-ps 来执行请求的功能:

    首先,您需要一个队列管理器连接 (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);
    

    对于每个单独的参数,您可以使用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);
    

    如果您还有其他问题,请告诉我。

    【讨论】:

    • ListQueueDepth 示例是我已经用来获取队列深度的示例。不幸的是,似乎没有涵盖我需要的其他统计信息的样本(最后一条消息获取/放置时间、en/dequeued 消息的数量、连接的客户端数量)。
    • 感谢详尽的回复!太糟糕了,enq/deq 计数需要重置统计信息,这太麻烦了。
    • 我将其称为“WMQ 的量子 API 调用”:观察值的行为会改变值。我也从来没有真正喜欢过这种行为。如果您想请求新功能“查询队列统计信息”,请使用 WMQ 请求表单bit.ly/WMQReq
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多