2017-05-10 4 views
0

Ich arbeite am Lesen großer MQ-Nachrichten in Java und Verarbeitung + Schreiben der Inhalte von MQ-Nachricht in eine Datei.Umgang mit großen MQ-Objekten in Java

Der Code, den ich schreibe, ist Multi-Threaded und kann mehrere Nachrichten parallel verarbeiten.

Die schreibende Anwendung schreibt (PUT) große MQ-Nachricht mit Segmentierung + Gruppierung in die Warteschlange.

Jetzt, während unten lesen Schritte stattfinden.

  1. Sets entsprechende Werte für MQGetMessageOptions.

    MQGetMessageOptions getGroupMsgOptions = new MQGetMessageOptions(); 
    getGroupMsgOptions.options = MQC.MQGMO_LOGICAL_ORDER | MQC.MQGMO_SYNCPOINT 
    | MQC.MQGMO_ALL_MSGS_AVAILABLE | MQC.MQGMO_COMPLETE_MSG; 
    
  2. MQQueue initialisieren - serverFileQueue und MQMessage - reqMessage.

  3. Aufrufen der Methode get für MQQueue durch Übergeben von reqMessage und getGroupMsgOptions.

    serverFileQueue.get(reqMessage, getGroupMsgOptions); 
    
  4. Überprüfen des MQ-Nachricht-Flags in einer while-Schleife letztes Segment der letzten Nachricht in der Gruppe zu identifizieren.

  5. Schreiben Sie den Inhalt der Nachricht mit BufferedOutputStream in eine Datei.

Meine Frage ist, ob die MQ-Nachricht zu groß ist, sollte der Code java.lang.OutOfMemoryError bekommen?

Ich versuche zu verstehen, ob Schritt 3 serverFileQueue.get(...) würde gesamte MQ-Nachricht im Speicher geladen werden?

ODER nur Segmente würden geladen werden, also brauchen Sie sich keine Sorgen zu machen java.lang.OutOfMemoryError?

Antwort

2

Die Nachricht wird in Segmenten abgerufen werden, so müssen Sie sich keine Sorgen über die OutofMemory error.But jedes Segment eine separate MQGET Anruf sein sollte und Sie haben die Group und Segmenteigenschaften von MQGMO verwenden für alle Segmente des Abrufen Botschaft.

1

Zuerst wird MQ java.lang.OutOfMemoryError nicht auslösen. Wie 'subbaroc' sagt, wird der Code ein MQGET für jedes Nachrichtensegment durchführen und es liegt an deinem Code, alles wieder zusammenzusetzen.

Zweitens, wenn Sie 75 '100MB' Segmente haben, dann kann die JVM java.lang.OutOfMemoryError auslösen, weil JVM nicht genug Speicher für das hat, was Sie tun.

Drittens, warum erfinden Sie das Rad neu. Das ist ein kostenloses Open-Source-Projekt, geschrieben in Java, das genau das macht, was Sie tun. Es heißt Universal File Mover. Sie können den Quellcode herunterladen, um zu sehen, wie der Code die Nachrichtensegmentierung behandelt.

1

Wenn Sie die Option MQGMO_COMPLETE_MSG einschließen, wird das QM die logische Nachricht für Ihre Anwendung zusammenstellen, also ja, Ihr get wird die gesamte Nachricht zurückgeben.

Wie bereits erwähnt, ist es möglich, die Segmentnachrichten zu erhalten und die logische Nachricht in Ihrer Anwendung zusammenzusetzen, aber Sie müssen den Code dafür ändern.Einige weitere Erklärung:

https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q026390_.htm

Und übrigens Gruppierung und Segmentierung ist zwei sehr verschiedene Dinge. Die Gruppierung wird verwendet, um die Reihenfolge der einzelnen logischen Nachrichten anzugeben, während die Segmentierung die Übertragung einer großen logischen Nachricht als mehrere kleinere Segmentnachrichten ermöglicht. Die Segmentierung erfordert oder impliziert keine Gruppierung. Also denke ich, die Option MQGMO_ALL_MSGS_AVAILABLE macht in Ihrem Fall wenig Sinn und sollte stattdessen MQGMO_ALL_SEGMENTS_AVAILABLE verwenden.