首页 > 解决方案 > 如何通过带有 RFH 的 IBM MQ 远程队列发送消息头属性?

问题描述

我需要将消息推送到发送一些标头属性的远程队列中。在我这边,我使用的是 IBM MQ v9,我不能使用 MQRFH2,只能使用“本机”MQ 标头(我不确定是否可能)。但是当我拉出消息时,我看不到任何属性。

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

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);
        System.out.println("destination: " + destination);
        MQDestination mqDestination = (MQDestination) destination;
        // the header properties to be added
        mqDestination.setStringProperty("KEY1", "VALUE1");
        mqDestination.setStringProperty("KEY2", "VALUE2");
        mqDestination.setStringProperty("KEY3", "VALUE3");
        // WMQ_CLIENT_NONJMS_MQ - static final int WMQ_CLIENT_NONJMS_MQ
        // WMQ_TARGET_CLIENT property value. Target is an MQ application (RFH2 will be excluded).
        mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
        System.out.println("mqDestination: " + mqDestination);
        String message = "mymessage";
        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");
            context = cf.createContext();
        } catch (JMSException e) {
            e.printStackTrace();
        }

        return context;
    }

}

标签: javapropertiesheaderibm-mq

解决方案


这段代码: -

mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);

在发送消息之前剥离消息属性。

您说您想使用“本机标头”而不是“MQRFH2”,但两者是完全可互换的。没有其中之一,这只是消息属性如何呈现给消息的接收者,这取决于它们如何能够使用它们。

如果你把消息属性和接收者在 RFH2 中要求它们,那么这就是他们将得到的。

如果您构建正确格式的 RFH2 标头并且接收器要求消息属性,那么这就是他们将得到的。

从您的应用程序中删除上述行,您的消息属性将流向接收器。


推荐阅读