【问题标题】:How to send message header properties through IBM MQ remote queue with RFH?如何通过带有 RFH 的 IBM MQ 远程队列发送消息头属性?
【发布时间】:2021-10-02 02:01:45
【问题描述】:

我需要将消息推送到发送一些标头属性的远程队列中。 在我这边,我使用的是 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;
    }

}

【问题讨论】:

  • 您使用什么技术/API 来尝试读取消费者端的属性?
  • 您已经将 WMQ_CLIENT_NONJMS_MQ 设置为 TARGETCLIENT。这可确保您的应用程序发送的消息没有 RFH2 标头。你面临什么问题?

标签: java properties header ibm-mq


【解决方案1】:

这段代码:-

mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);

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

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

如果您在 RFH2 中放置消息属性并且接收者要求它们,那么这就是它们将得到的。

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

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

【讨论】:

    【解决方案2】:

    为了补充 Morag 的评论,人们对术语感到困惑。 MQRFH2 消息与 JMS 消息相同。

    • MQRFH2 (JMS) 消息可以具有消息属性
    • 常规(本机)MQ 消息不包含消息属性

    从高层次来看,MQRFH2 (JMS) 消息如下所示:

    [MQMD][MQRFH2]message payload
    

    从高级的常规(本机)MQ 消息看起来像:

    [MQMD]message payload
    

    【讨论】:

    • 要明确 - 即使您离 JMS 很远 - 您仍然可以拥有消息属性,并且您可以使用本机 MQ API 调用(MQSETMP 等)构建它们,或者您可以构建一个 MQRFH2 标头自己文件夹。两者对收件人应用程序的最终结果完全相同。以某种方式暗示 MQRFH2 消息是 JMS 的事情可能会令人困惑。 JMS 是 MQRFH2 标头的众多用户之一。
    • @MoragHughson - 是的。我尝试为新手保持简单(KIS)。 :)
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2019-08-29
    • 2013-08-04
    • 2021-08-17
    相关资源
    最近更新 更多