我的任务:我有一个IBM MQ系列提供的队列系统。我需要获得一个" Dead-Letter-Queue"的所有消息。 RFH2-Header和原始有效载荷在Dead-Letter中组装。我的原始有效负载主要是zip文件或字符串。由于有效负载是zip文件的可能性,我需要将有效负载保存为java中的byte []。 RFH2应该是一个Linked 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);
}
}
现在发生了什么: 如果我从数据中创建一个新的消息get,它会通过第2066个字符切割rfh2。如果我调用原始有效负载,我会得到一个NullPointer。
关键是什么?
正如我在作业中提到的那样,RFH2和原始有效载荷都组装在&#34; Dead-Letter-Payload&#34; (我希望你能解读我想说的话)。我到目前为止尝试的是搜索有效负载中的</usr>
- 结束标记并保存这两部分。我将第一部分保存为String,将第二部分保存为byte []。如果这有效,我绝对不知道。
我的问题: 是否可以将Dead-Letter-Payload分成两部分并将第一部分保存为字符串,将第二部分保存为byte []?
答案 0 :(得分:1)
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));