Befolgen Sie die nachfolgenden Anweisungen, um den Nachrichtenfluss 'XML_Reservation' zu erstellen. Ausführlichere Anweisungen erhalten Sie jeweils über die Links am Ende eines jeden Schritts.
So erstellen und konfigurieren Sie den Nachrichtenfluss 'XML_Reservation':
Knotentyp | Knotenname |
---|---|
MQEmpfang | XML_RESERVATION_IN |
MQSenden | XML_RESERVATION_OUT |
MQSenden | XML_RESERVATION_FAIL |
Rechnen | UpdatePassengerTable |
Rechnen | BuildSingleMessage |
Rechnen | PropagateMultipleMessages |
Database | UpdateFlightTable |
Filter | MultipleOrSingleMessage |
Ausnahme | InvalidRequest |
Traceknoten | LogException |
Knotenname | Terminal | Mit diesem Knoten verbinden |
---|---|---|
XML_RESERVATION_IN | Out | UpdateFlightTable |
Catch | XML_RESERVATION_FAIL | |
UpdateFlightTable | Out | UpdatePassengerTable |
UpdatePassengerTable | Out | MultipleOrSingleMessage |
MultipleOrSingleMessage | Unknown (Unbekannt) | InvalidRequest |
False (Falsch) | BuildSingleMessage | |
True (Wahr) | PropagateMultipleMessages | |
BuildSingleMessage | Out | XML_RESERVATION_OUT |
PropagateMultipleMessages | Out | XML_RESERVATION_OUT |
XML_RESERVATION_FAIL | Out | LogException |
Knotenname | Seite | Eigenschaft | Wert |
---|---|---|---|
XML_RESERVATION_IN | Grundeinstellung | Warteschlangenname | XML_RESERVATION_IN (Die lokale Warteschlange, aus der der Nachrichtenfluss die Nachricht abruft.) |
Default | Nachrichtendomäne | XML (Weist den Broker an, den generischen XML-Parser zu verwenden.) |
|
UpdateFlightTable | Grundeinstellung | Datenquelle | RESERVDB (Die von diesem Knoten verwendete Datenbank.) |
Grundeinstellung | Anweisung | UpdateFlightTable (Der Name des vom Knoten während der Verarbeitung verwendeten ESQL-Moduls. Der Name muss dem Namen in der Anweisung CREATE DATABASE MODULE in der ESQL-Datei entsprechen.) |
|
UpdatePassengerTable | Grundeinstellung | Datenquelle | RESERVDB (Die von diesem Knoten verwendete Datenbank.) |
Grundeinstellung | ESQL-Modul | UpdatePassengerTable (Der Name des vom Knoten während der Verarbeitung verwendeten ESQL-Moduls. Der Name muss dem Namen in der Anweisung CREATE COMPUTE MODULE in der ESQL-Datei entsprechen.) |
|
XML_RESERVATION_OUT | Grundeinstellung | Warteschlangenname (Die Angabe des WS-Managernamens ist nicht erforderlich, da die Warteschlange in demselben WS-Manager wie der Broker definiert ist.) |
XML_RESERVATION_OUT (Die lokale Warteschlange, in die der Nachrichtenfluss die Nachricht einreiht.) |
LogException | Grundeinstellung | Zieladresse | lokales Fehlerprotokoll (Weist den Knoten an, die Trace-Informationen im lokalen Fehlerprotokoll zu speichern. Unter Windows ist 'Event Viewer' das lokale Fehlerprotokoll; unter Linux 'syslog'.) |
Grundeinstellung | Muster | Date is: ${EXTRACT (MONTH FROM CURRENT_DATE)}/ ${EXTRACT (DAY FROM CURRENT_DATE)}/ ${EXTRACT (YEAR FROM CURRENT_DATE)} Time is: ${EXTRACT (HOUR FROM CURRENT_TIMESTAMP)}: ${EXTRACT(MINUTE FROM CURRENT_TIMESTAMP)} Environment is: ${Environment} Exception List is: ${ExceptionList} (Extrahiert Datum, Zeit sowie Informationen zum Fehler aus der Ausnahmeliste.) |
|
Grundeinstellung | Nachrichtennummer | 3052 | |
XML_RESERVATION_FAIL | Grundeinstellung | Warteschlangenname (Die Angabe des WS-Managernamens ist nicht erforderlich, da die Warteschlange in demselben WS-Manager wie der Broker definiert ist.) |
XML_RESERVATION_FAIL (In diese Warteschlange reiht der Nachrichtenfluss die Nachricht ein, wenn die Verarbeitung fehlschlägt.) |
-- ************************************************ -- * ESQL for the XML_Reservation message flow -- ************************************************ CREATE DATABASE MODULE UpdateFlightTable CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- Umgebung mit Fluginformationen aus der Datenbank füllen SET Environment.Variables = THE (SELECT T.* FROM Database.XMLFLIGHTTB AS T WHERE T.FLIGHTDATE = Root.XML.Reservation.FlightDetails.FlightDate AND T.FLIGHTNO = Root.XML.Reservation.FlightDetails.FlightNumber); DECLARE ref REFERENCE TO Root.XML.Reservation.ListOfPassengers.PassengerDetails[1]; -- verbleibende Anzahl der Sitze erfassen SET Environment.Variables.EconomyClassRemain = CAST(Environment.Variables.TOTALECONOMIC AS INTEGER); SET Environment.Variables.FirstClassRemain = CAST(Environment.Variables.TOTALFIRST AS INTEGER); -- in einer Schleife durch die Anforderung laufen, Passagiere zählen und Kapazität überprüfen SET Environment.Variables.NoPassengers = 0; WHILE LASTMOVE(ref) DO -- check that the REFERENCE is still valid IF ref.Class = 'F' THEN IF Environment.Variables.FirstClassRemain >= 1 THEN SET Environment.Variables.FirstClassRemain = Environment.Variables.FirstClassRemain - 1; SET Environment.Variables.FIRSTCLASS = Environment.Variables.FIRSTCLASS + 1; SET Environment.Variables.NoPassengers = Environment.Variables.NoPassengers + 1; ELSE THROW USER EXCEPTION MESSAGE 2949 VALUES('Number of passengers exceeds capacity'); END IF; END IF; IF ref.Class = 'Y' THEN IF Environment.Variables.EconomyClassRemain >= 1 THEN SET Environment.Variables.EconomyClassRemain = Environment.Variables.EconomyClassRemain - 1; SET Environment.Variables.ECONOMICCLASS = Environment.Variables.ECONOMICCLASS + 1; SET Environment.Variables.NoPassengers = Environment.Variables.NoPassengers + 1; ELSE THROW USER EXCEPTION MESSAGE 2949 VALUES('Number of passengers exceeds capacity'); END IF; END IF; MOVE ref NEXTSIBLING REPEAT NAME; -- Bedingung für die Schleife erhöhen END WHILE; -- Datenbank mit verringerter Verfügbarkeit an Sitzen für den Flug aktualisieren UPDATE Database.XMLFLIGHTTB AS T SET ECONOMICCLASS = Environment.Variables.ECONOMICCLASS, TOTALECONOMIC = Environment.Variables.EconomyClassRemain, FIRSTCLASS = Environment.Variables.FIRSTCLASS, TOTALFIRST = Environment.Variables.FirstClassRemain WHERE T.FLIGHTDATE = Root.XML.Reservation.FlightDetails.FlightDate AND T.FLIGHTNO = Root.XML.Reservation.FlightDetails.FlightNumber; RETURN TRUE; END; END MODULE; CREATE COMPUTE MODULE UpdatePassengerTable CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN SET OutputRoot = InputRoot; DECLARE I INTEGER 1; DECLARE J INTEGER Environment.Variables.NoPassengers; DECLARE resno CHARACTER; WHILE I <= J DO -- loop through the passengers SET Environment.Variables.RESERVATIONSEQNO = Environment.Variables.RESERVATIONSEQNO + 1; -- (eindeutige) Reservierungsnummer generieren SET resno = (InputRoot.XML.Reservation.FlightDetails.FlightNumber || InputRoot.XML.Reservation.FlightDetails.FlightDate || CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR)); -- Zeile in Datenbank einfügen, um diese Reservierung zu überwachen INSERT INTO Database.XMLPASSENGERTB (LASTNAME, FIRSTNAME, FLIGHTNO, FLIGHTDATE, CLASSTYPE, RESERVATIONNO) VALUES(InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].LastName, InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].FirstName, InputRoot.XML.Reservation.FlightDetails.FlightNumber, InputRoot.XML.Reservation.FlightDetails.FlightDate, InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].Class, resno); -- Reservierungsnummer in der Ausgabenachricht melden SET OutputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].ReservationNumber = resno; SET I = I + 1; END WHILE; -- Sequenznummer in der Datenbank aktualisieren UPDATE Database.XMLFLIGHTTB AS T SET RESERVATIONSEQNO = Environment.Variables.RESERVATIONSEQNO; RETURN TRUE; END; END MODULE; CREATE FILTER MODULE MultipleOrSingleMessage CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN IF Root.XML.Reservation.Request = 'M' THEN RETURN TRUE; END IF; IF Root.XML.Reservation.Request = 'S' THEN RETURN FALSE; END IF; RETURN UNKNOWN; END; END MODULE; CREATE COMPUTE MODULE BuildSingleMessage CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN SET OutputRoot = InputRoot; SET OutputRoot.XML.Reservation = NULL; SET OutputRoot.XML.PassengerReservationResponse.ListOfConfirmations.ClassF.Confirmation[] = (SELECT X.FirstName, X.LastName AS Surname, X.ReservationNumber FROM InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[] AS X WHERE UPPER(X.Class) = 'F'); SET OutputRoot.XML.PassengerReservationResponse.ListOfConfirmations.ClassY.Confirmation[] = (SELECT X.FirstName, X.LastName AS Surname, X.ReservationNumber FROM InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[] AS X WHERE UPPER(X.Class) = 'Y'); RETURN TRUE; END; END MODULE; CREATE COMPUTE MODULE PropagateMultipleMessages CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER Environment.Variables.NoPassengers; WHILE I <= J DO SET OutputRoot = InputRoot; SET OutputRoot.XML.Reservation = NULL; SET OutputRoot.XML.PassengerReservationResponse.ListOfConfirmations.Confirmation = InputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I]; PROPAGATE; SET I = I + 1; END WHILE; RETURN FALSE; -- Rückgabe von 'false' stoppt automatische Weitergabe END; END MODULE;
Dieser ESQL-Code verwendet als Datenträger die Umgebungsbaumstruktur. Im professionellen Einsatz ist dies möglicherweise anders. Die zweite SET-Anweisung im ESQL-Modul 'UpdateFlightTable' füllt den Ordner 'Environment.Variables' mit den Elementen (Daten), die aus der Flugtabelle (XMLFLIGHTTB) extrahiert wurden. Die Namen der Elemente des Ordners werden von den Spaltennamen der Flugtabelle (XMLFLIGHTTB) übernommen. Die Anweisung generiert die nachfolgende Umgebungsbaumstruktur. Weitere Informationen zur Umgebungsbaumstruktur finden Sie unter Die logische Nachrichtenbaumstruktur.
( (0x1000000)Variables = ( (0x3000000)FLIGHTDATE = '20020220' (0x3000000)FLIGHTNO = 'CA937' (0x3000000)ECONOMICCLASS = 18 (0x3000000)FIRSTCLASS = 9 (0x3000000)TOTALECONOMIC = 200 (0x3000000)TOTALFIRST = 50 (0x3000000)ECONOMICPRICE = 200 (0x3000000)FIRSTPRICE = 300 (0x3000000)STARTPOINT = 'BEIJING ' (0x3000000)ENDPOINT = 'LONDON ' (0x3000000)EconomyClassRemain = 182 (0x3000000)FirstClassRemain = 41 (0x3000000)NoPassengers = 3 ) )
Für den Zugriff auf sich wiederholende Strukturen der Nachrichtenbaumstruktur verwendet das Modul 'UpdateFlightTable' die dynamische Referenz aus dem Feld REFERENCE sowie die Anweisung MOVE (siehe Beispiele, die mit DECLARE ref REFERENCE TO und While LASTMOVE(ref) beginnen) anstelle der Anweisung CARDINALITY. Für den Zugriff auf sich wiederholende Strukturen sind Feldreferenzvariablen besser geeignet.
Die Verwendung der Anweisung CARDINALITY innerhalb einer WHILE-Schleife hat negative Auswirkungen auf die Leistung des Nachrichtenflusses. Dabei steigt der mit der Anweisung CARDINALITY verbundene Systemaufwand in einer Schleife, da bei jeder Ausführung der Anweisung die Anzahl der Instanzen in dem Array ermittelt wird.
Dieser ESQL-Code verwendet als Datenträger für die Zwecke des 'Airline Reservations'-Beispiels die Umgebungsbaumstruktur. Dies ist im professionellen Einsatz möglicherweise nicht die beste Lösung.
Nun haben Sie den Nachrichtenfluss 'XML_Reservation' erstellt, mit dem Sitzplätze auf einem Flug reserviert und Antwortnachrichten erstellt werden, mit denen bestätigt wird, dass die Reservierungen vorgenommen wurden.