如何从Java中MQ系列死信的有效负载(byte [])拆分RFH2(String)?

时间:2016-06-13 06:39:08

标签: java bytearray ibm-mq mq

我的任务:我有一个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 []?

1 个答案:

答案 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));