如何用Python向IBM MQ发送带自定义JMS属性的压缩Zip消息?
解决IBM MQ发送Zip压缩消息并设置JMS属性的问题
我来帮你搞定这两个问题,针对你尝试的两种Python方案,分别给出修正后的可运行实现:
一、使用pymqi发送Zip压缩消息并设置JMS属性
pymqi是直接调用IBM MQ原生API的库,要发送二进制Zip数据并添加JMS属性,核心要注意两点:传递二进制消息体,以及通过RFH2头部承载JMS自定义属性(原生MQ API没有直接的JMS属性接口,JMS属性通常封装在RFH2结构中)。
修正后的代码
import pymqi import zlib from pymqi import CMQC, CMQCFC # MQ连接配置 queue_manager = 'QM1' channel = 'DEV.APP.SVRCONN' host = '127.0.0.1' port = '1414' queue_name = 'TEST.1' conn_info = '%s(%s)' % (host, port) # 1. 准备数据并生成Zip压缩字节流 original_data = b"Hello from Python! This is test data to compress." compressed_data = zlib.compress(original_data) # 若需标准Zip文件,可改用zipfile+BytesIO实现 try: # 连接MQ管理器 qmgr = pymqi.connect(queue_manager, channel, conn_info) queue = pymqi.Queue(qmgr, queue_name) # 2. 构造MQ消息对象,配置二进制消息体 msg = pymqi.Message() msg.compressed = False # 禁用MQ自带压缩,使用我们自己的Zip压缩 msg.format = CMQC.MQFMT_NONE # 二进制消息用NONE格式 msg.message_data = compressed_data # 3. 添加RFH2头部,设置JMS自定义属性Compressed='Y' rfh2 = pymqi.RFH2() rfh2.add_property("Compressed", "Y") # 注入自定义JMS属性 msg.rfh2 = rfh2 # 发送消息 queue.put(msg) print("压缩消息发送成功") except pymqi.MQMIError as e: print(f"MQ错误: {e}") finally: queue.close() qmgr.disconnect()
关键修改说明
- 用
zlib.compress生成压缩字节流(如果需要生成包含多文件的标准Zip包,可结合io.BytesIO和zipfile库实现) - 使用
pymqi.Message承载二进制数据,设置MQFMT_NONE适配二进制格式 - 通过
RFH2头部传递JMS属性,这是IBM MQ中承载JMS自定义属性的标准方式
二、使用Spring Python发送Zip压缩消息并设置JMS属性
Spring Python的JMS模板更贴近JMS规范,你之前的问题在于用了仅支持字符串的TextMessage,需要改用BytesMessage来发送二进制Zip数据,同时通过JMS标准方法设置自定义属性。
修正后的代码
from springpython.jms.core import BytesMessage, JmsTemplate from springpython.jms.factory import WebSphereMQConnectionFactory import zlib # MQ连接配置 qm_name = "QM.1" channel = "SVRCONN1.1" host = "192.168.1.121" listener_port = "1434" queue1 = "TEST.1" # 1. 准备压缩数据 original_data = b"Hello from Spring Python! Compressed test data." compressed_data = zlib.compress(original_data) try: # 创建连接工厂和JMS模板 factory = WebSphereMQConnectionFactory(qm_name, channel, host, listener_port) jms_template = JmsTemplate(factory) # 2. 定义消息创建回调:生成BytesMessage并设置属性 def build_compressed_message(session): msg = session.create_bytes_message() msg.write_bytes(compressed_data) # 设置JMS自定义属性Compressed='Y' msg.set_string_property("Compressed", "Y") return msg # 发送消息 jms_template.send(queue1, build_compressed_message) print("压缩消息发送成功") except Exception as e: print(f"发送错误: {e}") finally: factory.destroy()
关键修改说明
- 替换
TextMessage为BytesMessage,专门用于承载二进制压缩数据 - 通过
set_string_property方法设置JMS自定义属性,符合JMS规范的标准用法 - 使用回调函数创建消息,适配Spring JMS模板的设计模式
内容的提问来源于stack exchange,提问作者Agam
相关产品推荐
相关产品推荐

