Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取MQ队列列表pymqi?_Python_Ibm Mq_Pymqi - Fatal编程技术网

Python 如何获取MQ队列列表pymqi?

Python 如何获取MQ队列列表pymqi?,python,ibm-mq,pymqi,Python,Ibm Mq,Pymqi,您希望获取特定队列管理器的队列列表。我似乎明白如何做到这一点,但当我尝试时,我得到了一个错误 回溯(最近一次调用上次):文件 “D:/project/Work project/queue list.py”,第23行,在 response=pcf.MQCMD\u INQUIRE\u Q(args)文件“C:\Users\shevcova\AppData\Local\Programs\Python\Python37\lib\site packages\pymqi\u init\uuq.py”, 第2

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

回溯(最近一次调用上次):文件 “D:/project/Work project/queue list.py”,第23行,在 response=pcf.MQCMD\u INQUIRE\u Q(args)文件“C:\Users\shevcova\AppData\Local\Programs\Python\Python37\lib\site packages\pymqi\u init\uuq.py”, 第2769行,在呼叫中 message=self.\u pcf.reply\u queue.get(无,get\u md,get\u opts)文件 “C:\Users\shevcova\AppData\Local\Programs\Python\Python37\lib\site packages\pymqi_init.py”, 第2021行,在get中 提高MQMIError(rv[-2],rv[-1],message=rv[0],original_length=rv[-3])pymqi.MQMIError:MQI Error。薪酬:2,原因 2033:失败:MQRC\u无可用消息

我的代码:

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()
import pymqi
import date_conn

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

c = 0
attrs = {
        pymqi.CMQC.MQCA_Q_NAME :'*'
    }
result = pcf.MQCMD_INQUIRE_Q(attrs)

for queue_info in result:
        queue_name = queue_info[pymqi.CMQC.MQCA_Q_NAME]
        print(queue_name)
        c+=1

print(c)
qmgr.disconnect()

只需安装以下版本,即可解决此错误。也就是说,Meln有PyMQi 1.12.0,现在是PyMQi 1.11.0

我的代码:

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()
import pymqi
import date_conn

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

c = 0
attrs = {
        pymqi.CMQC.MQCA_Q_NAME :'*'
    }
result = pcf.MQCMD_INQUIRE_Q(attrs)

for queue_info in result:
        queue_name = queue_info[pymqi.CMQC.MQCA_Q_NAME]
        print(queue_name)
        c+=1

print(c)
qmgr.disconnect()

只需安装以下版本,即可解决此错误。也就是说,Meln有PyMQi 1.12.0,现在是PyMQi 1.11.0

我的代码:

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()
import pymqi
import date_conn

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

c = 0
attrs = {
        pymqi.CMQC.MQCA_Q_NAME :'*'
    }
result = pcf.MQCMD_INQUIRE_Q(attrs)

for queue_info in result:
        queue_name = queue_info[pymqi.CMQC.MQCA_Q_NAME]
        print(queue_name)
        c+=1

print(c)
qmgr.disconnect()

1.12.0 pymqi使用不同的逻辑从响应队列获取PCF响应消息

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

要解决此问题,可以使用PCFExecute构造函数的response\u wait\u 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))

1.12.0 pymqi使用不同的逻辑从响应队列获取PCF响应消息

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

要解决此问题,可以使用PCFExecute构造函数的response\u wait\u 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))

没有从命令服务器收到任何消息通常表明它出于某种原因(通常是权威)不喜欢您的命令消息。检查DLQ上有什么,如果没有定义DLQ,请设置一个DLQ,以便命令服务器可以将其不喜欢的消息发送到那里。AMQERR01.LOG中可能也有一些内容,但我不记得命令服务器是否在那里写入了内容。@MoragHughson我不知道。如何显示示例“名称”\u示例:“如何显示队列”。显示了我没有的队列。输出:
INFO:root:Found queue
b'SYSTEM.CLUSTER.TRANSMIT.MODEL.queue`您是说如果您更改前缀和队列类型,您的代码会工作吗?@morag hughson是的,如果我不写
prefix=“SYSTEM.*”
。在这种情况下没有错误,我注意到您使用的是双引号,而您提到的示例使用的是单引号。在您之前的评论中,您说使用带有双引号的
prefix=“SYSTEM.*”
确实有效。你确定你在这种情况下使用了双引号吗?我仍然认为,如果您可以在队列管理器上设置一个DLQ,并通过查看其中写入的内容来查看命令服务器是否拒绝了该命令,那么诊断起来就更容易了。我们目前只是猜测。没有从命令服务器返回消息通常是因为某种原因(通常是权威)它不喜欢您的命令消息的迹象。检查DLQ上有什么,如果没有定义DLQ,请设置一个DLQ,以便命令服务器可以将其不喜欢的消息发送到那里。AMQERR01.LOG中可能也有一些内容,但我不记得命令服务器是否在那里写入了内容。@MoragHughson我不知道。如何显示示例“名称”\u示例:“如何显示队列”。显示了我没有的队列。输出:
INFO:root:Found queue
b'SYSTEM.CLUSTER.TRANSMIT.MODEL.queue`您是说如果您更改前缀和队列类型,您的代码会工作吗?@morag hughson是的,如果我不写
prefix=“SYSTEM.*”
。在这种情况下没有错误,我注意到您使用的是双引号,而您提到的示例使用的是单引号。在您之前的评论中,您说使用带有双引号的
prefix=“SYSTEM.*”
确实有效。你确定你在这种情况下使用了双引号吗?我仍然认为,如果您可以在队列管理器上设置一个DLQ,并通过查看其中写入的内容来查看命令服务器是否拒绝了该命令,那么诊断起来就更容易了。我们目前只是猜测。