以字符串形式从 MQ 获取相关 ID



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

我正在设置相关 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;
}

我所需要的只是将48 位十六进制字符串转换为我设置的原始相关 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);
}

未明确设置报告选项。

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

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

MQRO_PASS_CORREL_ID如果报告或答复是由于 此消息,此消息的 CorrelId 被复制到 CorrelId 的报告或回复消息。

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

我自己设置了消息ID,现在我做得很好

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

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

最新更新