首页 > 解决方案 > 如何获取 MQ 队列 pymqi 的列表?

问题描述

您想要获取特定队列管理器的队列列表。我似乎明白如何做到这一点,但是当我尝试时,我得到了一个错误。

回溯(最后一次调用):文件“D:/project/Work-Project/queue list.py”,第 23 行,响应 = pcf.MQCMD_INQUIRE_Q(args) 文件“C:\Users\ShevcovAA\AppData\Local\ Programs\Python\Python37\lib\site-packages\pymqi_init _.py ”,第 2769 行,调用 消息 = self._pcf.reply_queue.get (None, get_md, get_opts) 文件“C:\Users\ShevcovAA\ AppData\Local\Programs\Python\Python37\lib\site-packages\pymqi_ init .py",第 2021 行,在 get raise MQMIError(rv[-2], rv[-1], message=rv[0], original_length =rv[-3]) pymqi.MQMIError:MQI 错误。比较:2,原因 2033:失败:MQRC_NO_MSG_AVAILABLE

我的代码:

import logging
import re
import pymqi

logging.basicConfig(level=logging.INFO)

queue_manager = 'QM1'
channel = 'DEV.APP.SVRCONN'
host = '127.0.0.1'
port = '1414'
conn_info = '%s(%s)' % (host, port)

prefix = "*"
queue_type = pymqi.CMQC.MQQT_LOCAL

args = {pymqi.CMQC.MQCA_Q_NAME: prefix,
        pymqi.CMQC.MQIA_Q_TYPE: queue_type}

qmgr = pymqi.connect(queue_manager, channel, conn_info)
pcf = pymqi.PCFExecute(qmgr)

response = pcf.MQCMD_INQUIRE_Q(args)

for queue_info in response:
    queue_name = queue_info[pymqi.CMQC.MQCA_Q_NAME]
    if (re.match('^SYSTEM', queue_name) or re.match('^AMQ', queue_name) or re.match('^MQ', queue_name)):
        pass
    else:
        q = pymqi.Queue(qmgr, queue_name)
        print(queue_name.strip() + ':' + 'Queue  depth:', q.inquire(pymqi.CMQC.MQIA_CURRENT_Q_DEPTH))
        q.close()

qmgr.disconnect()

标签: pythonibm-mqpymqi

解决方案


v1.12.0 pymqi 使用不同的逻辑从响应队列中获取 PCF 响应消息。

默认情况下,使用 5 秒的超时时间来等待响应。因此,如果您有很多队列或者您的 QM 负载过重,这可能还不够。

要解决此问题,您可以使用 PCFExecute 构造函数的 response_wait_interval 参数来增加此间隔。

pcf = pymqi.PCFExecute(qmgr, response_wait_interval=30000) # 30 seconds

v1.11.0 没有这个参数,使用默认的 30 秒间隔。

并且避免查询每个队列的深度,只需查询 MQIA_CURRENT_Q_DEPTH 属性。

在 v1.12+ 中支持的新符号中,它将类似于:

    attrs = []  # type: List[pymqi.MQOpts]
    attrs.append(pymqi.CFST(Parameter=pymqi.CMQC.MQCA_Q_NAME,
                            String=pymqi.ensure_bytes(prefix)))
    attrs.append(pymqi.CFIN(Parameter=pymqi.CMQC.MQIA_Q_TYPE,
                            Value=queue_type))
    attrs.append(pymqi.CFIL(Parameter=pymqi.CMQCFC.MQIACF_Q_ATTRS,
                            Values=[pymqi.CMQC.MQIA_CURRENT_Q_DEPTH]))

    object_filters = []
#        object_filters.append(
#            pymqi.CFIF(Parameter=pymqi.CMQC.MQIA_CURRENT_Q_DEPTH,
#                       Operator=pymqi.CMQCFC.MQCFOP_GREATER,
#                       FilterValue=0))

    response = pcf.MQCMD_INQUIRE_Q(attrs, object_filters)

    for queue_info in response:
        queue_name = queue_info[pymqi.CMQC.MQCA_Q_NAME]
        queue_depth = queue_info[pymqi.CMQC.MQIA_CURRENT_Q_DEPTH]
        print('{}: {} message(s)'.format(queue_name.strip().decode(), queue_depth))

推荐阅读