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
相关产品推荐
相关产品推荐

