You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python发送带RFH2头的IBM MQ消息遇DataError,求正确实现方法

解决IBM MQ发送带RFH2头消息的DataError问题

错误原因很明确:接收端的MQ处理程序要求消息必须包含MQRFH2头的/usr节点(也就是报错里提到的MQRFH2/usr - MQMD USR folder),但你的代码直接发送了原始文件数据,没有构造并附加这个RFH2头。

要解决这个问题,你需要手动构造符合要求的RFH2头,并将其与消息体一起发送。以下是修改后的代码:

import pymqi
from pymqi import MQRFH2

qm_name='Axxx'
channel='Gxxxx'
host='uxxxx'
port='1xx'
conn_info='%s(%s)' % (host, port)

file_name="/xxxxx/Test01_InsertSucess01.dat"
q_name="Axxxxx.FLOWQ"

# 连接队列管理器和队列
qm = pymqi.QueueManager(None)
qm.connectTCPClient(qm_name, pymqi.cd(), channel, conn_info)
queue = pymqi.Queue(qm, q_name)

# 读取消息体
with open(file_name, 'rb') as f:
    data = f.read()

# 构造RFH2头,重点是/usr节点
# 这里的键值对需要根据接收端的实际要求调整,比如添加业务需要的字段
rfh2 = MQRFH2()
rfh2.set('usr', {
    'TransactionType': 'Insert',
    'SourceSystem': 'PythonClient',
    'MessageID': 'Test01_001'
})

# 将RFH2头编码为字节,并与消息体拼接
# RFH2头需要用UTF-8编码,然后和二进制消息体组合
rfh2_bytes = rfh2.encode('utf-8')
full_message = rfh2_bytes + data

# 发送完整消息
queue.put(full_message)

# 关闭资源
queue.close()
qm.disconnect()

关键注意事项:

  • /usr节点的字段必须匹配接收端要求:你需要和接收方确认/usr下需要哪些字段(字段名、数据类型),示例中的字段只是占位,必须替换成实际业务需要的内容。
  • 编码格式:RFH2头本质是XML结构,必须用UTF-8编码,确保和接收端的解码格式一致。
  • pymqi版本:确保使用的pymqi版本支持MQRFH2类,若版本过旧可能需要升级。

内容的提问来源于stack exchange,提问作者Jithin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:35:16