python - 如何获取 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()
解决方案
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))
推荐阅读
- python - 在 Python 中存储仍在变化的变量
- angular - 如何删除本地存储中对象数组中的特定对象?(角度 10+)
- c# - ZipArchive - 从列表中压缩文件
- 创建大型空 Zip 文件 - javascript - 是否所有错误消息都应该以可以显示给用户的形式来自后端?
- java - 如何以编程方式将 Lotus Notes 电子邮件文档转换为 MIME 格式
- python - 无法在带有 bs4 的标签中获取特定的 href 链接
- php - 在 Perfex CRM 上显示没有表格的项目表格的问题
- python - 如何使用硒在新页面上抓取弹出窗口?
- python - 用excel中的元素替换字符串中的单词。Python
- r - 如何在函数中引用列名