Python 3.x 提交时发生MQRC_环境_错误
尝试使用pymqi向IBM MQ发送消息时遇到问题。 我正在做的一个项目Python 3.x 提交时发生MQRC_环境_错误,python-3.x,ibm-mq,python-multiprocessing,pymqi,Python 3.x,Ibm Mq,Python Multiprocessing,Pymqi,尝试使用pymqi向IBM MQ发送消息时遇到问题。 我正在做的一个项目 从DB2读取数据 为WorkerProcess WorkerProcess基于该数据执行一些决策,并向MQ发送消息 当WorkerProcess尝试提交MQ的消息时,我收到一个错误: Stacktrace: worker_process.py: self.mq.commit() mq_service.py: self.qmgr.commit() pymqi/__i
- 从DB2读取数据
- 为
WorkerProcess
基于该数据执行一些决策,并向MQ发送消息WorkerProcess
WorkerProcess
尝试提交MQ的消息时,我收到一个错误:
Stacktrace:
worker_process.py:
self.mq.commit()
mq_service.py:
self.qmgr.commit()
pymqi/__init__.py line 1689, in commit
raise MQMIError (rv[0], rv[1])
pymqi.MQMIError: MQI Error. Comp: 2, Reason 2012: FAILED: MQRC_ENVIRONMENT_ERROR
代码和堆栈跟踪是手工输入的,可能包含打字错误
下面的代码是我正在做的事情的伪代码
非常感谢您的帮助和/或建议
main.py:
c_processors = []
for i in range(num_of_proccessors):
p = WorkerProcess()
p.start()
c_processors.append(p)
for p in c_processors:
p.join()
def connect_to_mq():
return MQService(args*) # these arguments are read from Config file
def process_chunk(args*):
_mq = connect_to_mq()
_mq.send_message('test')
_mq.commit()
_mq.close_connection()
c_processors = []
for i in range(num_of_proccessors):
p = Process(target=process_chunk, args=(args*))
p.start()
c_processors.append(p)
for p in c_processors:
p.join()
worker_process.py
class WorkerProcess(Process):
def __init__(self):
Process.__init__(self)
self.mq = MQService()
def run(self):
self.mq.send_message('test')
self.mq.commit()
self.mq.close_connection()
mq_service.py
class MQService():
def __init__(self):
self.connect()
self.pmd = pymqi.MD()
self.pmd.Format = pymqi.CMQC.MQFMT_STRING
self.pmo = pymqi.PMO(Options=pymqi.CMQC.MQPMO_FAIL_IF_QUIESCING)
self.pmo.Options |= pymqi.CMQC.MQGMO_SYNCPOINT
def connect(self):
self._connect_to_qmgr(manager,chanel,host,port,user,password) #these arguments are retrieved from config
self._q = pymqi.Queue(self.qmgr, queue_name)
def _connect_to_qmgr(self,manager,chanel,host,port,user,password):
self.qmgr = pymqi.QueueManager(None)
_cd = pymqi.CD()
_cd.ChannelName = channel.encode('utf-8')
_cd.ConnectionName = f"{host} ({port})".encode('utf-8')
_cd.ChannelType = pymqi.CMQC.MQCHT_CLNTCONN
_cd.TransportType = pymqi.CMQC.MQXPT_TCP
_connect_options = pymqi.CMQC.MQCNO_HANDLE_SHARE_BLOCK
_qmgr.connect_with_options(manager, cd=_cd, opts=_connect_options, user=user, password=password)
def send_message(self, message):
self._q.put(message, self.pmd, self.pmo)
def commit(self):
self.qmgr.commit()
def rollback(self):
self.qmgr.backout()
def close_connection(self):
self.qmgr.disconnect()
class MQService():
def __init__(self, args*):
self.pmd = pymqi.MD()
self.pmd.Format = pymqi.CMQC.MQFMT_STRING
self.pmo = pymqi.PMO(Options=pymqi.CMQC.MQPMO_FAIL_IF_QUIESCING)
self.pmo.Options |= pymqi.CMQC.MQGMO_SYNCPOINT
self.connect_to_qmgr(args*)
self.connect_to_queue(args*)
def _connect_to_qmgr(self,manager,chanel,host,port,user,password):
self.qmgr = pymqi.connect(manager,
chanel,
"%s (%s)" % (host, port),
user=user,
password=password)
def connect_to_queue(q_name):
self._q = pymqi.Queue(self.qmgr, q_name)
def send_message(self, message):
self._q.put(message, self.pmd, self.pmo)
def commit(self):
self.qmgr.commit()
def rollback(self):
self.qmgr.backout()
def close_connection(self):
self.qmgr.disconnect()
编辑:
其他信息:
- 我正在运行IBMMQ客户端版本9.1.0.1
文件中没有错误AMQERR0*.LOG
- 已设置LD_库_路径
- 重构代码时显示此错误
c_processors = []
for i in range(num_of_proccessors):
p = WorkerProcess()
p.start()
c_processors.append(p)
for p in c_processors:
p.join()
def connect_to_mq():
return MQService(args*) # these arguments are read from Config file
def process_chunk(args*):
_mq = connect_to_mq()
_mq.send_message('test')
_mq.commit()
_mq.close_connection()
c_processors = []
for i in range(num_of_proccessors):
p = Process(target=process_chunk, args=(args*))
p.start()
c_processors.append(p)
for p in c_processors:
p.join()
mq_service.py
class MQService():
def __init__(self):
self.connect()
self.pmd = pymqi.MD()
self.pmd.Format = pymqi.CMQC.MQFMT_STRING
self.pmo = pymqi.PMO(Options=pymqi.CMQC.MQPMO_FAIL_IF_QUIESCING)
self.pmo.Options |= pymqi.CMQC.MQGMO_SYNCPOINT
def connect(self):
self._connect_to_qmgr(manager,chanel,host,port,user,password) #these arguments are retrieved from config
self._q = pymqi.Queue(self.qmgr, queue_name)
def _connect_to_qmgr(self,manager,chanel,host,port,user,password):
self.qmgr = pymqi.QueueManager(None)
_cd = pymqi.CD()
_cd.ChannelName = channel.encode('utf-8')
_cd.ConnectionName = f"{host} ({port})".encode('utf-8')
_cd.ChannelType = pymqi.CMQC.MQCHT_CLNTCONN
_cd.TransportType = pymqi.CMQC.MQXPT_TCP
_connect_options = pymqi.CMQC.MQCNO_HANDLE_SHARE_BLOCK
_qmgr.connect_with_options(manager, cd=_cd, opts=_connect_options, user=user, password=password)
def send_message(self, message):
self._q.put(message, self.pmd, self.pmo)
def commit(self):
self.qmgr.commit()
def rollback(self):
self.qmgr.backout()
def close_connection(self):
self.qmgr.disconnect()
class MQService():
def __init__(self, args*):
self.pmd = pymqi.MD()
self.pmd.Format = pymqi.CMQC.MQFMT_STRING
self.pmo = pymqi.PMO(Options=pymqi.CMQC.MQPMO_FAIL_IF_QUIESCING)
self.pmo.Options |= pymqi.CMQC.MQGMO_SYNCPOINT
self.connect_to_qmgr(args*)
self.connect_to_queue(args*)
def _connect_to_qmgr(self,manager,chanel,host,port,user,password):
self.qmgr = pymqi.connect(manager,
chanel,
"%s (%s)" % (host, port),
user=user,
password=password)
def connect_to_queue(q_name):
self._q = pymqi.Queue(self.qmgr, q_name)
def send_message(self, message):
self._q.put(message, self.pmd, self.pmo)
def commit(self):
self.qmgr.commit()
def rollback(self):
self.qmgr.backout()
def close_connection(self):
self.qmgr.disconnect()
您是否安装了mq客户端库?检查文件
AMQERR01.LOG
并查看错误。还要确保您的库路径包括MQ安装库(32位)或lib64(64位)。感谢您的帮助@JoshMc;我忘了提到这个错误发生在代码重构之后。我已经编辑了我的问题并添加了以前的代码/var/mqm/errors/AMQERR01.log为空。添加connect\u options=pymqi.CMQC.MQCNO\u HANDLE\u SHARE\u块的建议是什么?这被记录为“应用程序和本地队列管理器代理是同一执行单元的一部分”。错误描述说明“应用程序链接到错误的库(线程或非线程)。”pymqi是否编译为支持多线程?您好,如果我不使用此选项,我将连接MQRC_。我在pymqi中找到了这个解决方案