我在向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);
}
答案 0 :(得分:2)
我自己设置了消息ID,现在我已经很好了
请勿自行设置消息的messageId。让队列管理器为每个放入队列的消息创建唯一的messageId。如果您需要将消息与消息一起传递(1)将其放入消息数据/有效负载中,或者(2)在消息中添加消息属性(也称为命名属性)。
如果您创建自己的messageId,那么可能会出现重复的messageIds,这是一件非常糟糕的事情并违反了最佳实践。 IBM MQ Best Practices说让队列管理器创建一个唯一的messageId。
答案 1 :(得分:2)
未明确设置您的报告选项。
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;