如何在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消息的扩展属性,需要调用MQINQMPAPI指定属性名查询 - 如果使用JMS API拉取,只要发送端和接收端都配置了
WMQ_CLIENT_NONJMS_MQ,直接调用message.getStringProperty("KEY1")就可以读取到属性
内容的提问来源于stack exchange,提问作者VEMM
相关产品推荐
相关产品推荐

