我正在使用 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/