使用UOM(begin/commit/backout)PUT消息时遇MQRC_ENVIRONMENT_ERROR排查
IBM MQ事务PUT代码报2012 MQRC_ENVIRONMENT_ERROR的排查要点
我用pymqi编写了两段IBM MQ消息PUT代码:第一段无事务逻辑的代码可正常运行;第二段加入begin/commit/backout事务逻辑后,出现2012 MQRC_ENVIRONMENT_ERROR错误。已知该错误通常源于环境或配置问题,想了解需检查的具体内容。注:IBM MQ事务需结合MQOO_INPUT_EXCLUSIVE和MQOO_OUTPUT选项使用。
两段对比代码
无事务逻辑的正常代码
import pymqi queue_manager = 'QM1' channel = 'DEV.APP.SVRCONN' host = '127.0.0.1' port = '1414' queue_name = 'TEST.1' conn_info = f'{host}({port})' # Connect to the queue manager qmgr = pymqi.connect(queue_manager, channel, conn_info) queue = pymqi.Queue(qmgr, queue_name, pymqi.CMQC.MQOO_OUTPUT) try: for rec in range(1,21): message = f"hello python {rec}" queue.put(message) except Exception as err: print(f"(err)") queue.close() qmgr.disconnect()
加事务逻辑后报错的代码
import pymqi queue_manager = 'QM1' channel = 'DEV.APP.SVRCONN' host = '127.0.0.1' port = '1414' queue_name = 'TEST.1' conn_info = f'{host}({port})' # Connect to the queue manager qmgr = pymqi.connect(queue_manager, channel, conn_info) queue = pymqi.Queue(qmgr, queue_name, pymqi.CMQC.MQOO_OUTPUT) pmo = pymqi.PMO() pmo.Options = pymqi.CMQC.MQPMO_SYNCPOINT | pymqi.CMQC.MQPMO_FAIL_IF_QUIESCING transaction = False try: # transaction start qmgr.begin() # set the flag true after qmgr begin transaction = True for rec in range(1,21): mqmd = pymqi.MD() mqmd.Version = pymqi.CMQC.MQMD_VERSION_2 if rec == 9: raise Exception("Some Error occur") message = f"hello python {rec}" queue.put(message, mqmd, pmo) # commit the transaction if all message were successfully processed qmgr.commit() except Exception as err: if transaction: # rollback the transaction if any error occur during the processing qmgr.backout() finally: queue.close() qmgr.disconnect()
具体排查内容
队列打开选项缺失:你已经提到IBM MQ事务需要结合
MQOO_INPUT_EXCLUSIVE和MQOO_OUTPUT选项,但第二段代码打开队列时仅用了MQOO_OUTPUT,缺少事务必需的MQOO_INPUT_EXCLUSIVE选项。修改队列打开代码为:queue = pymqi.Queue(qmgr, queue_name, pymqi.CMQC.MQOO_OUTPUT | pymqi.CMQC.MQOO_INPUT_EXCLUSIVE)通道权限与配置:
- 检查
DEV.APP.SVRCONN通道的MCAUSER是否具备执行事务操作的权限,包括对目标队列的PUT权限、事务提交/回滚的相关权限。 - 确认队列管理器QM1的事务日志配置正常:日志路径存在且有读写权限,队列管理器未处于事务禁用状态。
- 检查
版本兼容性:确保pymqi版本与本地安装的IBM MQ客户端版本匹配,版本不兼容可能导致事务API调用失败。
事务操作顺序:虽然你的代码顺序正确,但需确认
qmgr.begin()是在队列打开之后执行,事务操作必须在队列资源初始化完成后进行。错误信息细化:当前异常捕获仅打印
(err),建议修改为print(f"Error: {err}"),获取更详细的错误堆栈,定位具体触发点。
内容的提问来源于stack exchange,提问作者user_123
相关产品推荐
相关产品推荐

