Das Beispielprogramm 'Large Messaging' ist eine Beispielanwendung für einen Nachrichtenfluss, der am Ende eines Tages zur Verarbeitung der Verkaufszahlen ausgeführt wird. Die Nachrichten, in denen die Verkaufszahlen über den Tag aufgezeichnet wurden, werden im Laden für die Übertragung zur IT-Zentrale zu einem Stapel zusammengefasst. Bei Eingang in der IT-Zentrale werden die zu einem Stapel zusammengefassten Nachrichten für die weitere Verarbeitung wieder in die Einzelnachrichten aufgeteilt. Diese Aufteilung wird durch einen Nachrichtenfluss von WebSphere Message Broker ausgeführt. Jede einzelne Nachricht, die einen Verkaufsvorgang darstellt, hat dieselbe Struktur.
Die Eingabe- und Ausgabenachrichten in diesem Beispielprogramm werden zur Vereinfachung des Vorgangs als selbstdefinierende XML-Nachrichten implementiert. Es können jedoch auch andere Nachrichtenformat verwendet werden.
Jede Eingabenachricht besteht aus drei Teilen:
Die Struktur 'SaleList' ist komplex. Sie enthält folgende Elemente:
Das Verarbeitungsziel in diesem Beispielprogramm ist es, jede einzelne Instanz der Struktur 'SaleList' als eigene WebSphere MQ-Nachricht zu schreiben und gleichzeitig den Gesamtspeicherbedarf zu minimieren. Die Verwendung des virtuellen Speichers wird dadurch minimiert, dass jene Teile der Nachrichtenbaumstruktur, die bereits verarbeitet wurden, gelöscht werden. Ohne diese Vorgehensweise würde die Nachrichtenbaumstruktur mit jeder Verarbeitung einer 'SaleList'-Struktur größer werden.
Wenn das Anwachsen der Nachrichtenbaumstruktur nicht eingedämmt wird, führt dies zu einem sehr hohen Bedarf an virtuellem Speicher für die Ausführungsgruppe, in der der Nachrichtenfluss ausgeführt wird. Bei Eingabenachrichten, die mehrere Megabyte groß sind, kann dies die Leistung erheblich beeinträchtigen. Der Bedarf an virtuellem Speicher kann je nach der Größe der Eingabenachricht bis auf Hunderte von Megabyte oder sogar Gigabyte ansteigen.
Für dieses Verfahren zum Einschränken des Speicherbedarfs ist eine variable Nachrichtenbaumstruktur erforderlich. Dies bedeutet, dass es möglich sein muss, Teile der Nachrichtenbaumstruktur zu löschen. Die Nachrichtenbaumstruktur für 'InputRoot' ist nicht variabel, d. h. es können bei Bedarf keine Elemente aus der Baumstruktur gelöscht werden. Dementsprechend wird eine weitere Baumstruktur im Nachrichtenfluss erstellt. Sie wird mit Hilfe der Variable 'ESQL ROW' und dem Funktionsaufruf 'ESQL CREATE' erstellt.
In diesem Beispielprogramm wird die Verarbeitung in einem Nachrichtenfluss ausgeführt. Die Verarbeitungsschritte werden nachfolgend beschrieben.
Der Nachrichtenfluss 'Large Messaging' führt die folgenden Verarbeitungsschritte aus:
Der Nachrichtenfluss 'Large Messaging' besteht aus folgenden Knoten:
Der MQEmpfangsknoten 'MessageWithRepeatingElements' liest die WebSphere MQ-Nachrichte, die XML-Nutzdaten enthält. Da die eingehende Nachricht in einem selbstdefinierenden XML-Format ist, ist es nicht erforderlich, eine Nachrichtengruppe oder ein Nachrichtenformat anzugeben, damit sie erfolgreich syntaktisch analysiert werden kann.
Der Rechenknoten 'ProduceMessageSlicesFromRepeatingElements' übernimmt den Hauptteil der Verarbeitung für den Nachrichtenfluss. Er führt folgende Verarbeitungsschritte aus:
Der Filterknoten 'IdentifyWhenSlicingIsComplete' wendet einen Filterausdruck auf die vom Knoten 'ProduceMessageSlicesFromRepeatingElements' weitergegebene Nachricht an. Der Zweck dieses Tests ist es, festzustellen, ob die beim Knoten eingehende Nachricht in die Warteschlange der verarbeiteten 'SaleList'-Nachrichten oder in die Bestätigungsnachricht für die Stapelverarbeitung geschrieben werden soll. Wenn es sich um eine Nachricht handelt, die ein 'SaleList'-Element enthält, wird die Verarbeitung an den MQSendeknoten 'RepeatedElementSlices' übergeben, der die Nachricht in die WebSphere MQ-Warteschlange schreibt. Wenn es sich bei der beim Filterknoten 'IdentifyWhenSlicingIsComplete' eingegangenen Nachricht um die Stapelbestätigung handelt, wird sie vom MQSendeknoten 'MessageSlicingComplete' als WebSphere MQ-Nachricht in eine andere Warteschlange als die 'SaleList'-Elemente geschrieben.
Darüber hinaus befinden sich weitere Knoten im Nachrichtenfluss, die zur Verarbeitung verschiedener Fehlerbedingungen dienen. Der MQSendeknoten 'General Failure' ist dem Fehlerterminal des MQEmpfangsknotens zugeordnet. Wenn bei der Verarbeitung im MQSendeknoten ein Fehler auftritt, schreibt der Knoten die Nachricht in die Warteschlange, die im MQEmpfangsknoten genannt wird. Der Abfangknoten des MQEmpfangsknotens ist mit dem Filterknoten 'CatchProcessing' verbunden. Eine Nachricht wird entlang dieser Route weitergegeben, wenn im weiteren Verlauf des Nachrichtenflusses eine Ausnahmebedingung auftritt, von der dieser Knoten betroffen ist. Der Filterausdruck in der Catch-Verarbeitung stellt fest, ob die zu verarbeitende Nachricht das erwartete Format hat. Wenn dies nicht der Fall ist, wird die Verarbeitung an den Fehlerausnahmeknoten übergeben, der einen Benutzerfehler ausgibt. Wenn die Nachricht in irgendeiner Weise beschädigt ist, z. B. wenn das letzte Feld nicht 'SlicingReport' heißt, wird die Verarbeitung an den MQSendeknoten 'Malformed Messages' übergeben, der die Nachricht in eine Fehlerwarteschlange schreibt.
Die Testnachricht, die zur Steuerung des Beispielprogramms 'Nachrichtenrouting' wird, ist eine selbstdefinierende XML-Nachricht, die Rechnungsdaten für einen Kunden enthält. Die Nachricht kann in der Größe erweitert werden, indem das Element 'SaleList' wiederholt wird. Die Nachricht in diesem Beispielprogramm enthält zehn Wiederholungen des Elements 'SaleList'. Das Nachrichtenlayout wird nachfolgend angegeben. In diesem Fall wird nur eine Instanz des Elements 'SaleList' dargestellt.
<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>K</Initial>
<Initial>A</Initial>
<Surname>Braithwaite</Surname>
<Item>
<Code>00</Code>
<Code>01</Code>
<Code>02</Code>
<Description>Twister</Description>
<Category>Games</Category>
<Price>00.30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code>
<Code>03</Code>
<Code>01</Code>
<Description>The Times Newspaper</Description>
<Category>Books and Media</Category>
<Price>00.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00.50</Balance>
<Currency>Sterling</Currency>
</Invoice>
<Invoice>
<Initial>T</Initial>
<Initial>J</Initial>
<Surname>Dunnwin</Surname>
<Item>
<Code>04</Code>
<Code>05</Code>
<Code>01</Code>
<Description>The Origin of Species</Description>
<Category>Books and Media</Category>
<Price>22.34</Price>
<Quantity>02</Quantity>
</Item>
<Item>
<Code>06</Code>
<Code>07</Code>
<Code>01</Code>
<Description>Microscope</Description>
<Category>Miscellaneous</Category>
<Price>36.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>81.84</Balance>
<Currency>Euros</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>