我的任务:我有一个由IBM MQ系列提供的队列系统。我需要获取"死信队列"的所有消息。RFH2标头和原始有效载荷组装在死信中。我的原始负载主要是一个zip文件或字符串。由于负载可能是一个zip文件,所以我需要将负载保存为java中的byte[]。RFH2应该是一个链接的HashMap。
到目前为止我得到了什么:
public ZMessageDTO(final ZMessageType messageType, MQMessage message) throws ZDAEQException {
this.mqMessage = message;
this.messageType = messageType;
List<byte[]> payloadRFH2List = this.split("</usr>".getBytes(StandardCharsets.UTF_8));
rfh2 = getRFH2OfXMLBytes(payloadRFH2List.get(0));
payload = payloadRFH2List.get(1);
}
public boolean isMatch(byte[] pattern, byte[] input, int pos) {
for (int i = 0; i < pattern.length; i++) {
if (pattern[i] != input[pos + i]) {
return false;
}
}
return true;
}
public List<byte[]> split(byte[] pattern) throws ZDAEQException {
try {
byte[] input = new byte[(int) mqMessage.getMessageLength()];
for (int i = 0; i < (int) mqMessage.getMessageLength(); i++) {
input[i] = mqMessage.readByte();
}
List<byte[]> l = new LinkedList<byte[]>();
int blockStart = 0;
for (int i = 0; i < input.length; i++) {
if (isMatch(pattern, input, i)) {
l.add(Arrays.copyOfRange(input, blockStart, i));
blockStart = i + pattern.length;
i = blockStart;
}
}
l.add(Arrays.copyOfRange(input, blockStart, input.length));
return l;
} catch (IOException e) {
throw new ZDAEQException("Couldn't split dead letter" + e);
}
}
现在发生了什么:如果我用获取的数据创建一个新的Message,它会将rfh2截断2066个字符。如果我调用原始负载,我会得到一个NullPointer。
关键是什么正如我在任务中提到的,RFH2和原始有效载荷都组装在"死信有效载荷"中(我希望你能理解我想说的)。到目前为止,我尝试的是在有效负载中搜索</usr>
结束标记并保存这两个部分。我将第一部分保存为String,将第二部分保存为byte[]。我完全不知道这是否有效。
我的问题:是否可以将死信有效负载分为两部分,并将第一部分保存为字符串,将第二部分保存为字节[]?
MQRFH2结构非常复杂。如果您不理解,为什么不使用MQRFH2类?
IBM提供了MQRFH2类,因此开发人员不必处理该结构。
即
mqMsg.seek(0);
MQRFH2 rfh2 = new MQRFH2(mqMsg);
byte[] data = new byte[mqMsg.getDataLength()];
mqMsg.readFully(data);
System.out.println("Message data: "+new String(data));