java - 获取字符串格式的 MQ messageId

标签 java ibm-mq

我正在使用 IBM 的 mq 库从 MQ 队列中读取消息。现在我需要检索消息的 messageid。我现在它位于名称 messageId 下的消息 header 中。但这会返回一个 byte[]。现在我需要将其更改为可读字符串。

如何将 messageId 从 byte[] 转换为字符串?

我尝试了几次转换,但没有一个有效:

new String(theMessage.messageId)
new String(theMessage.messageId, "UTF-8")
new String(theMessage.messageId, "UTF-16")
theMessage.messageId.toString()

最佳答案

MQMD 中的 messageId 表示为 24 个字节。如果您知道这些是在哪个平台上生成的,您可以通过将字节转换为生成它们的队列管理器的字符集中的字符来找到它们的某些部分的某些含义,但不建议依赖于任何正在传送的数据在 messageID 中作为字符数据,因为我看到 IBM 的声明类似于“MsgId 是由 MQ 以 IBM 专有格式生成的,它可能随时更改。”

如果您想将它们表示为字符串,您应该将它们表示为代表 24 个字节的 48 个字符的十六进制字符串。

下面是 IBM 在技术说明中提供的示例函数 getHexString,它将为您执行此转换。你会像这样使用它:

getHexString(theMessage.messageId)

下面的示例函数来自 IBM MQ 技术说明“How to match correlation id's when request is made via JMS application and reply generated from base Java API

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;
}

IBM 在知识中心页面“Reference>Developing applications reference>MQI applications reference>Data types used in the MQI>MQMD - Message descriptor>Fields>MsgId (MQBYTE24)”底部记录了队列管理器生成的消息 ID 的格式和唯一性

A MsgId generated by the queue manager consists of a 4-byte product identifier (AMQ¬ or CSQ¬ in either ASCII or EBCDIC, where ¬ represents a blank character), followed by a product-specific implementation of a unique string. In IBM® MQ this contains the first 12 characters of the queue-manager name, and a value derived from the system clock. All queue managers that can intercommunicate must therefore have names that differ in the first 12 characters, in order to ensure that message identifiers are unique. The ability to generate a unique string also depends on the system clock not being changed backward. To eliminate the possibility of a message identifier generated by the queue manager duplicating one generated by the application, the application must avoid generating identifiers with initial characters in the range A through I in ASCII or EBCDIC (X'41' through X'49' and X'C1' through X'C9'). However, the application is not prevented from generating identifiers with initial characters in these ranges.

关于java - 获取字符串格式的 MQ messageId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729239/

相关文章:

php - 如何在PHP中使用SSL认证连接到WebSphere MQ队列

java - 使用 spring 集成从 wmq 获取 JMS 目标

java - 创建表的实体

java - 根据输入参数有选择地复制 Maven 中的资源?

java - 安装 SecurityManager 时 MQQueueManager 构造函数挂起

ibm-mq - MQ 版本之间的差异

ibm-mq - 用于 Apple 芯片的 IBM MQ

java - 为什么 Android 应用程序在长时间运行时会重新初始化,即使该应用程序没有执行任何操作?

java - 阿拉伯值在 jsp servlet 中不起作用

java - 我们可以只使用 odbc 和 java 连接数据库吗?