2016-06-13 3 views
0

Meine Aufgabe: Ich habe ein Warteschlangensystem von der IBM MQ-Serie zur Verfügung gestellt. Ich muss alle Nachrichten einer "Dead-Letter-Queue" bekommen. Der RFH2-Header und die ursprüngliche Nutzlast wurden im Dead-Letter zusammengebaut. Ich die ursprüngliche Nutzlast ist meist eine Zip-Datei oder eine Zeichenfolge. Da es möglich ist, dass die Payload eine Zip-Datei ist, muss ich die Payload als ein Byte [] in Java speichern. Die RFH2 sollte eine Linked HashMap sein.Wie teilt man die RFH2 (String) aus der Payload (Byte []) eines MQ-Serie Dead Letter in Java?

Was ich bisher habe:

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); 
    } 
} 

Was jetzt geschieht: Wenn ich eine neue Nachricht aus den Daten ein get erstellen, schneidet sie die RFH2 vom 2066. char . Wenn ich die ursprüngliche Payload anrufe, bekomme ich einen NullPointer.

Was ist die Crux? Wie ich in der Aufgabe erwähnt habe, sind sowohl der RFH2 als auch die ursprüngliche Nutzlast in der "Dead-Letter-Payload" zusammengefasst (ich hoffe du verstehst, was ich zu sagen versuche). Was ich bisher versucht habe, ist die Nutzlast nach dem </usr> -Endtag zu durchsuchen und die beiden Teile zu speichern. Ich habe den ersten Teil als String und den zweiten Teil als Byte [] gespeichert. Ich habe absolut keine Ahnung ob das funktioniert oder nicht.

Meine Frage: Ist es möglich, die Dead Letter-Payload in zwei Teile und speichern Sie die erste als String und die zweite als byte [] zu spalten?

+0

Ich bin kein Java-Programmierer, aber können Sie verwenden nicht die MQHeaderIterator oder MQHeaderList? Siehe http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q030880_.htm - auf dieser Seite befinden sich verschiedene andere hilfreiche Dinge, die Sie vermutlich benötigen. –

Antwort

1

Die MQRFH2-Struktur ist sehr komplex. Wenn Sie es nicht verstehen, warum benutzen Sie dann nicht die Klasse MQRFH2?

IBM stellt die MQRFH2-Klasse bereit, sodass Entwickler sich nicht mit der Struktur befassen müssen.

heißt

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)); 
+0

Danke, aber ich bekomme diese drei Fehler: MQJE001: Beendungscode '1', Ursache '2142'. MQJE001: Beendungscode '2', Ursache '2195'. MQJE001: Beendungscode '2', Ursache '2195'. Ich habe sie gegoogelt, aber sie scheinen für meinen Fall nicht korrekt zu sein. Es scheint besonders, dass ich eine Instanz von MQRFH2 erstellen, aber nie verwenden. –

Verwandte Themen