【问题标题】:Get the Correlation ID from MQ as string从 MQ 获取关联 ID 作为字符串
【发布时间】:2018-05-31 01:02:34
【问题描述】:

我在向 MQ 发送消息时设置关联 ID。我需要使用我推送的消息的 COA 中的 CorrelationID 进行进一步处理。

我正在使用以下代码设置关联 ID 并将消息发送到队列。

MQMessage message = createMQMessage("12345");
message.write("Some message to push".getBytes());
queue.put(message);

private MQMessage createMQMessage(String corrID){

        MQMessage message = new MQMessage();
        message.messageFlags = MQConstants.MQMF_SEGMENTATION_ALLOWED;

        if (ackQueueName != null) {

            message.messageType = MQConstants.MQMT_REQUEST;
            message.replyToQueueManagerName = ackQueueManagerName;
            message.replyToQueueName = ackQueueName;
            message.report = MQConstants.MQRO_COA | MQConstants.MQRO_COD;
            message.correlationId = corrID.getBytes();



        }
        return message;
    }

我正在从另一个应用程序读取 replyQueue 以获取 COA 并提取相关 ID 以进行进一步处理。

但是相关 ID 是 byte[] 格式,我使用下面的方法 getHexString 来获取字符串。但我得到的只是我的相关 ID 的 48 位十六进制格式,例如

414d5120514d41444556202020202020b5ca0d5b13b3bb20

public static String getHexString(byte[] b) throws Exception {
        String result = "";
        for (int i=0; i < b.length; i++) {
            result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
        }


        return result;

    }

我需要的只是将 48digit HexString 转换为我设置的原始关联 ID 的方法。我尝试使用以下方法进行转换,但它给了我垃圾数据。

public static String hexStringToByteArray(String hex) {
        int l = hex.length();
        byte[] data = new byte[l/2];
        for (int i = 0; i < l; i += 2) {
            data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i+1), 16));
        }
        return new String(data);
    }

【问题讨论】:

  • Arrays.toString[byte[])
  • ok.. 我不是在问如何将 byte[] 转换为 String。我可以使用方法getHexString 获取字符串。 MQ 管理器在内部将字符串转换为十六进制..我只想将十六进制字符串转换为原始字符串格式..我正在编辑我的问题以使其清楚..对不起..!!
  • new String (byte[])
  • COA 消息在响应的相关 ID 中返回请求的消息 ID。
  • @JoshMc 非常感谢.. 这就是问题所在。我自己设置了消息 ID,现在可以了。

标签: java ibm-mq


【解决方案1】:

您的报告选项未明确设置。

MQRO_COPY_MSG_ID_TO_CORREL_ID 这是默认操作,并且 表示如果因此而生成报告或回复 消息,该消息的 MsgId 被复制到该消息的 CorrelId 举报或回复消息。

由于默认操作,您永远不会收到消息的初始关联 ID。正如 Roger 在他的回答中提到的那样,以编程方式设置 MsgID 是一种不好的做法。只需使用以下选项将 CorrelID 复制到报告消息中:

MQRO_PASS_CORREL_ID 如果报告或回复是由于以下原因生成的 此消息,此消息的 CorrelId 复制到 CorrelId 的报告或回复消息。

message.report = MQConstants.MQRO_COA 
                 | MQConstants.MQRO_COD 
                 | MQConstants.MQRO_PASS_CORREL_ID;

【讨论】:

  • 谢谢。我知道 Correlation ID 应该有 24 字节不超过。除了设置关联ID还有其他替代方法吗?
  • 您还可以选择设置MQRO_COA_WITH_DATA。这会将消息的前 100 个字节添加到报告中。
【解决方案2】:

我自己设置了消息ID,现在可以了

不要自己设置消息的 messageId。让队列管理器为放入队列的每条消息创建一个唯一的 messageId。如果您需要将信息与消息一起传递,则 (1) 将其放入消息数据/有效负载中或 (2) 将消息属性(也称为命名属性)添加到消息中。

如果您创建自己的 messageId,则可能会出现重复的 messageId,这是一件非常糟糕的事情,并且违反了最佳实践。 IBM MQ Best Practices 说让队列管理器创建一个唯一的 messageId。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2016-11-11
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多