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

如何在IBM MQ远程队列发送不带RFH2的原生MQ消息头属性

问题原因

你当前的写法存在两个核心错误:

  • 你把自定义业务属性设置到了MQDestination对象上,该对象的属性仅用于控制队列目的地的连接配置,不会被写入到消息头中
  • 禁用RFH2头之后,JMS默认的自定义属性存储载体被关闭,需要配置MQ将自定义属性映射为原生MQ消息属性存储
可行解决方案

IBM MQ v9版本完全支持不使用MQRFH2头存储自定义属性,直接使用原生MQ消息属性实现,修改代码如下:

import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.TextMessage;

import com.ibm.mq.jms.MQDestination;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;

public class MessageSender {

    public void sendMessage() throws JMSException {
        JMSContext context = createJMSContext();
        JMSProducer producer = context.createProducer();
        Destination destination = context.createQueue("queue:///" + queueName);
        MQDestination mqDestination = (MQDestination) destination;
        // 禁用RFH2头,目标为非JMS的原生MQ客户端
        mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
        
        // 自行创建消息对象,设置自定义属性,不要设置到Destination上
        TextMessage message = context.createTextMessage("mymessage");
        // 待添加的头属性设置到消息对象上
        message.setStringProperty("KEY1", "VALUE1");
        message.setStringProperty("KEY2", "VALUE2");
        message.setStringProperty("KEY3", "VALUE3");
        
        producer.send(mqDestination, message);
    }

    private JMSContext createJMSContext() {
        JMSContext context = null;
        try {
            JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
            JmsConnectionFactory cf = ff.createConnectionFactory();
            cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
            cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, false);
            cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "hostname");
            cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "channel");
            cf.setIntProperty(WMQConstants.WMQ_PORT, 1411);
            cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "queueManager");
            // 配置确保自定义属性不写入RFH2,直接存入原生MQ属性区
            cf.setBooleanProperty(WMQConstants.WMQ_PASS_MESSAGE_PROPERTIES_IN_RFH2, false);
            context = cf.createContext();
        } catch (JMSException e) {
            e.printStackTrace();
        }

        return context;
    }

}
拉取消息注意事项

如果你使用原生MQ API(非JMS)拉取消息读取属性,需要注意:

  • 自定义属性不会出现在MQMD结构体的固定字段中,属于MQ消息的扩展属性,需要调用MQINQMP API指定属性名查询
  • 如果使用JMS API拉取,只要发送端和接收端都配置了WMQ_CLIENT_NONJMS_MQ,直接调用message.getStringProperty("KEY1")就可以读取到属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:01