【问题标题】:Get byte stream of headers properties IBM MQ获取标头属性的字节流 IBM MQ
【发布时间】:2019-12-18 20:32:57
【问题描述】:

我使用 IBM MQ 从队列中获取消息。我得到对象 MQMessage 并解析它。这样,我就有了消息体的字节流,也有 MQMD 属性。那么,我怎样才能在字节数组中获取这些属性呢?

//Getting MQMessage
MQQueue queue = ...
MQMessage msg = new MQMessage();
queue.get(msg, options, size);

//For example this prop
String replyQueue = msg.replyToQueueName;

我需要它,因为在某些情况下,使用默认的“UTF-8”编码无法正确读取某些道具,但它应该。 所以MQMessage.readFully(byte[] b)只给我byte[]这样的消息体,我想得到MQMD和RFH2等消息头。

【问题讨论】:

    标签: java ibm-mq


    【解决方案1】:

    所有 MQMD 属性都可以通过以下方式访问:

    byte[] correlId = msg.correlationId;
    byte[] msglId = msg.messageId;
    String format = msg.format;
    int expiry = msg.expiry;
    String replyQueue = msg.replyToQueueName;
    

    有两种方法可以处理 JMS(又名 MQRFH2)消息:

    • 将其作为具有命名属性的消息检索
    • 将其作为 MQRFH2 消息检索

    要将 JMS 消息作为“具有命名属性的消息”获取,只需添加以下 MQGMO 选项:

    gmo.options += CMQC.MQGMO_PROPERTIES_IN_HANDLE; 
    

    然后,您可以使用 getter 方法检索任何命名属性。即要检索名为 StackOverflow 的字符串属性,您可以:

    String someValue = msg.getStringProperty("StackOverflow")

    要将 JMS 消息作为 MQRFH2 检索,只需添加一个 MQGMO(这是默认设置):

    gmo.options += CMQC.MQGMO_PROPERTIES_FORCE_MQRFH2;
    

    然后您需要将消息传递给 MQRFH2 类并从那里开始:

    msg.seek(0);
    MQRFH2 rfh2 = new MQRFH2(msg);
    String format = rfh2.getFormat();
    String[] folderStrings = rfh2.getFolderStrings();
    for (String folder : folderStrings)
    System.out.println("Folder: "+folder);
    

    【讨论】:

    • 非常感谢您的回答!一些奇怪的案例。例如,我将西里尔字放在 MQRFH2 标头的“格式”属性中,默认字符集是包含西里尔符号的 UTF-8。当我以这两种方式阅读此房产时,您以前的豪宅,我得到了错误的词。所以,问题是,如何通过选择字符集来获取标题属性,比如获取消息正文?或者以某种方式获取字节 [] 中的“格式”属性,而不是字符串格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多