WebSphere Message Broker Version 8.0.0.5 Betriebssysteme: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Sehen Sie sich die Informationen zur aktuellen Produktversion im IBM Integration Bus Version 9.0 an.

Mit umfangreichen Eingabenachrichten zur Weitergabe mehrerer Ausgabenachrichten arbeiten

Die Darstellung einer Nachricht in Form einer Baumstruktur ist in der Regel umfangreicher als der Eingabebitstrom. Für die Bearbeitung einer umfangreichen Nachrichtenbaumstruktur kann viel Speicher erforderlich sein, die Speicherbelastung auf dem Broker kann jedoch mithilfe von codierten Java™-Methoden reduziert werden.

Wenn ein Eingabebitstrom syntaktisch analysiert und eine logische Baumstruktur erstellt wird, ist die Darstellung einer Nachricht in Form einer Baumstruktur in der Regel umfangreicher, in einigen Fällen sogar wesentlich umfangreicher, als der Ausgangsbitstrom.
Hierfür sind u. a. folgende Faktoren verantwortlich:
  • Die Addition der Zeiger, mit denen die Objekte miteinander verknüpft werden
  • Die Umsetzung von Zeichendaten in Unicode, die den Umfang verdoppeln kann
  • Die Aufnahme von Feldnamen, die im Bitstrom möglicherweise implizit waren
  • Das Vorhandensein von Steuerdaten, die der Brokeroperation zugeordnet sind.

Für die Bearbeitung einer umfangreichen Nachrichtenbaumstruktur kann viel Speicher benötigt werden. Wenn Sie einen Nachrichtenfluss entwerfen, in dem umfangreiche Nachrichten mit sich wiederholenden Strukturen verarbeitet werden, können Sie Java-Methoden codieren und so den auf dem Broker erforderlichen Speicherplatz reduzieren. Diese Methoden unterstützen sowohl den wahlfreien als auch den sequenziellen Zugriff auf die Nachricht. Es wird jedoch vorausgesetzt, dass Sie nicht gleichzeitig auf die gesamte Nachricht zugreifen müssen.

Mit diesen Java-Methoden führt der Broker nur eine eingeschränkte Syntaxanalyse für die Nachricht durch und es wird nur jeweils der Teil der Nachrichtenbaumstruktur gespeichert, der einen einzelnen Datensatz darstellt. Wenn bei der Verarbeitung Informationen von Datensatz zu Datensatz beibehalten werden müssen (beispielsweise bei der Berechnung des Gesamtpreises auf der Basis sich wiederholender Artikel in einer Bestellung), können entweder Java-Variablen deklariert, initialisiert und verwaltet werden oder aber die Werte können in einem anderen Bereich der Nachrichtenbaumstruktur, beispielsweise in der lokalen Umgebung, gespeichert werden.

Mit diesem Verfahren reduziert sich der Speicherbedarf des Brokers, es wird nur noch der Speicherplatz für die vollständigen Eingabe- und Ausgabebitströme sowie der Speicher für die Nachrichtenbaumstrukturen eines einzigen Datensatzes benötigt. Somit kann selbst dann Speicherplatz eingespart werden, wenn die Nachricht einige Wiederholungen aufweist. Der Broker führt nur eine teilweise Syntaxanalyse durch und nutzt die Möglichkeit, bestimmte Bereiche der Nachrichtenbaumstruktur in und aus dem entsprechenden Bereich des Bitstroms syntaktisch zu analysieren.

Führen Sie einen der folgenden Schritte aus, um diese Verfahren in Ihrem JavaCompute-Knoten (oder in einem benutzerdefinierten Java-Knoten) einzusetzen:
  • Kopieren Sie das MbMessage-Eingabeobjekt mithilfe des Kopierkonstruktors. Auf diese Weise wird eine modifizierbare Kopie der Eingabenachricht erstellt, die nicht syntaktisch analysiert wird und daher nur einen minimalen Speicherbedarf hat.
  • Vermeiden Sie die Überprüfung der Eingabenachricht. Auf diese Weise wird die Notwendigkeit umgangen, die Nachricht syntaktisch zu analysieren.
  • Verwenden Sie eine Schleife und eine MbElement-Variable, um jeweils einen Datensatz nach dem anderen in der Nachricht zu bearbeiten. Führen Sie für jeden Datensatz die folgenden Prozesse aus:
    • Erstellen Sie mithilfe normaler Transformationen in einem MbMessage-Ausgabeobjekt eine entsprechende untergeordnete Ausgabebaumstruktur.
    • Löschen Sie mit der Methode MbElement.delete() die aktuelle Nachrichtenbaumstruktur für den Eingabedatensatz, wenn Sie die Bearbeitung des Datensatzes abgeschlossen haben.
    • Geben Sie mit folgendem Code die Ausgabenachricht für den aktuellen Datensatz weiter.
      MbOutputTerminal.propagate(MbMessageAssembly, true)
      Dieser Prozess ermöglicht die Wiederherstellung von Ressourcen und Parsern der Nachrichtenbaumstruktur und deren Wiederverwendung für die nächste Ausgabenachrichteniteration.

Sie können diese Verfahren variieren und so an die Verarbeitung anpassen, die für Ihre Nachrichten erforderlich ist.

Der folgende Java-Beispielcode veranschaulicht die Syntaxanalyse einer umfangreichen Eingabenachricht mit vielen sich wiederholenden Datensätzen. Dabei wird jeder Datensatz als einzelne Ausgabenachricht weitergegeben.

Die XMLNSC-Eingabenachrichten haben folgendes Format, wenn viele sich wiederholende Record-Elemente vorhanden sind.
<TestCase>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  ....
</TestCase>
Das folgende Beispiel veranschaulicht den Java-Code, mit dem immer jeweils ein Datensatz dieser umfangreichen Nachricht syntaktisch analysiert und jeder Datensatz weitergegeben werden kann.
//Erstellen Sie ein änderbares MbMessage-Objekt auf Basis der an inAssembly übergebenen Eingabenachricht.
MbMessage clonedInMessage = new MbMessage(inAssembly.getMessage());
//Jetzt wird die geklonte Eingabenachricht syntaktisch analysiert, jeweils ein Datensatz nach dem anderen.
MbElement inputRootElement = clonedInMessage.getRootElement();
MbElement inputPropertiesElement = inputRootElement.getFirstElementByPath("Properties");
MbElement inputMQMDElement = inputRootElement.getFirstElementByPath("MQMD");
MbElement inputXMLNSCElement = inputRootElement.getFirstElementByPath("XMLNSC");

MbElement inputXMLNSCRootTagElement = inputXMLNSCElement.getFirstChild(); //Zum TestCase-Tag wechseln
MbElement currentInputRecord = inputXMLNSCRootTagElement.getFirstChild(); //Zum Record-Tag wechseln

while(currentInputRecord != null)
{
  // Erstellen Sie eine neue Ausgabenachricht für den Datensatz, der weitergegeben werden soll.
  MbMessage outputMessage = new MbMessage();
  MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outputMessage);

  //Erstellen Sie neue Parserordner in der Ausgabenachricht.
  MbElement outputRootElement = outputMessage.getRootElement();
  MbElement outputPropertiesElement = outputRootElement.createElementAsLastChild(inputPropertiesElement.getParserClassName());
  MbElement outputMQMDElement = outputRootElement.createElementAsLastChild(inputMQMDElement.getParserClassName());
  MbElement outputXMLNSCElement = outputRootElement.createElementAsLastChild(inputXMLNSCElement.getParserClassName());       
  //Erstellen Sie den Root-Tag im XMLNSC-Ausgabeordner, der für diesen Ausgabedatensatz verwendet werden soll.
  MbElement outputXMLNSCRootTag = outputXMLNSCElement.createElementAsLastChild(MbElement.TYPE_NAME, "TestCase", null);
  //Erstellen Sie den Datensatz-Tag für diese Instanz der Ausgabenachricht.
  MbElement currentOutputRecord = outputXMLNSCRootTag.createElementAsLastChild(MbElement.TYPE_NAME, "Record", null);

  //Kopieren Sie den Eigenschaftenordner, den MQMD-Header und den aktuellen Datensatz.
  outputPropertiesElement.copyElementTree(inputPropertiesElement);
  outputMQMDElement.copyElementTree(inputMQMDElement);
  currentOutputRecord.copyElementTree(currentInputRecord);   

  //Geben Sie diese Nachricht weiter und fordern Sie dabei an, dass die Ausgabenachrichtenassembly nach der Weitergabe gelöscht wird.
  out.propagate(outAssembly, true);
  //Hinweis: Sie müssen clearMessage nicht für outputMessage aufrufen, da der Löschvorgang nach der Weitergabe erfolgt ist.

  //Referenzieren Sie den aktuellen Datensatz, damit er gelöscht werden kann.
  MbElement previousInputRecord = currentInputRecord;
  //Wechseln Sie jetzt zum nächsten Eingabedatensatz, der für die Verarbeitung bereit ist.
  currentInputRecord = currentInputRecord.getNextSibling();
  //Da nun zum nächsten gleichgeordneten Element gewechselt wurde, löschen Sie den bereits verarbeiteten Eingabedatensatz.
  previousInputRecord.delete();

}
Dieser Java-Code erstellt für jede sich wiederholende untergeordnete Record-Baumstruktur in der XMLNSC-Eingabenachricht eine Nachricht:
<Record>
  <Field1>A</Field1>
  <Field2>B</Field2>
  <Field3>C</Field3>
  <Field4>D</Field4>
  <Field5>E</Field5>
</Record>
Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Letzte Aktualisierung:
        
        Letzte Aktualisierung: 2015-02-28 16:22:32


TaskthemaTaskthema | Version 8.0.0.5 | bc23802_