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.
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.
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.
<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>
//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();
}
<Record>
<Field1>A</Field1>
<Field2>B</Field2>
<Field3>C</Field3>
<Field4>D</Field4>
<Field5>E</Field5>
</Record>