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':
Palettenfächer | Knotentyp | Knotenname |
---|---|---|
WebSphere MQ | MQ-Empfangsknoten | XML_RESERVATION_IN |
WebSphere MQ | MQOutput | XML_RESERVATION_OUT |
WebSphere MQ | MQOutput | XML_RESERVATION_FAIL |
Transformation | Rechnen | UpdatePassengerTable |
Transformation | Rechnen | BuildSingleMessage |
Transformation | Rechnen | PropagateMultipleMessages |
Datenbankknoten | Datenbankknoten | UpdateFlightTable |
Routing | Filter | MultipleOrSingleMessage |
Aufbau | Throw | InvalidRequest |
Aufbau | Trace | LogException |
Knotenname | Terminal | Mit diesem Knoten verbinden |
---|---|---|
XML_RESERVATION_IN | Ausgangsterminal | UpdateFlightTable |
Abfangterminal | XML_RESERVATION_FAIL | |
UpdateFlightTable | Ausgangsterminal | UpdatePassengerTable |
UpdatePassengerTable | Ausgangsterminal | MultipleOrSingleMessage |
MultipleOrSingleMessage | Unbekannt | InvalidRequest |
False | BuildSingleMessage | |
True | PropagateMultipleMessages | |
BuildSingleMessage | Ausgangsterminal | XML_RESERVATION_OUT |
PropagateMultipleMessages | Ausgangsterminal | XML_RESERVATION_OUT |
XML_RESERVATION_FAIL | Ausgangsterminal | LogException |
Knotenname | Seite | Eigenschaft | Wert |
---|---|---|---|
XML_RESERVATION_IN | Grundeinstellung | Name der Warteschlange | XML_RESERVATION_IN (Dieser Wert bezeichnet die lokale Warteschlange, aus der der Nachrichtenfluss die Nachricht abruft.) |
Syntaxanalyse der Eingabenachricht | Nachrichtendomäne | XMLNSC: Für XML-Nachrichten (Berücksichtigung von Namensbereichen, Überprüfung, geringe Speicherbelegung) (Mit diesem Wert wird der Broker angewiesen, den generischen XML-Parser zu verwenden.) |
|
UpdateFlightTable | Grundeinstellung | Datenquelle | RESERVDB (Dieser Wert gibt die von diesem Knoten verwendete Datenbank an.) |
Grundeinstellung | Anweisung | UpdateFlightTable |
|
UpdatePassengerTable | Grundeinstellung | Datenquelle | RESERVDB |
Grundeinstellung | ESQL-Modul | UpdatePassengerTable (Standardwert ersetzen) (Dieser Wert gibt den Namen des vom Knoten während der Verarbeitung verwendeten ESQL-Moduls an. Der Name muss dem Namen in der Anweisung CREATE COMPUTE MODULE in der ESQL-Datei entsprechen.) |
|
XML_RESERVATION_OUT | Grundeinstellung | Name der Warteschlange (Die Angabe des WS-Managernamens ist nicht erforderlich, da die Warteschlange in demselben WS-Manager wie der Broker definiert ist.) |
XML_RESERVATION_OUT (Dieser Wert gibt die lokale Warteschlange an, in die der Nachrichtenfluss die Nachricht einreiht.) |
LogException | Grundeinstellung | Destination (Zieladresse) | lokales Fehlerprotokoll (Mit diesem Wert wird der Knoten angewiesen, die Trace-Informationen im lokalen Fehlerprotokoll zu speichern. Unter Windows ist 'Event Viewer' das lokale Fehlerprotokoll; unter Linux 'syslog'.) |
Grundeinstellung | Muster (Pattern) | 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} (Mit diesem Wert werden Datum, Zeit sowie Informationen zum Fehler aus der Ausnahmeliste extrahiert.) |
|
Grundeinstellung | Nachrichtennummer | 3052 | |
MultipleOrSingleMessage | Grundeinstellung | Filterausdruck | MultipleOrSingleMessage |
BuildSingleMessage | Grundeinstellung | ESQL-Modul | BuildSingleMessage |
PropagateMultipleMessages | Grundeinstellung | ESQL-Modul | PropagateMultipleMessages |
XML_RESERVATION_FAIL | Grundeinstellung | Name der Warteschlange (Die Angabe des WS-Managernamens ist nicht erforderlich, da die Warteschlange in demselben WS-Manager wie der Broker definiert ist.) |
XML_RESERVATION_FAIL (Dieser Wert gibt die Warteschlange an, in die der Nachrichtenfluss die Nachricht einreiht, 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 Datenbank füllen SET Environment.Variables = THE (SELECT T.* FROM Database.XMLFLIGHTTB AS T WHERE T.FLIGHTDATE = Root.XMLNSC.Reservation.FlightDetails.FlightDate AND T.FLIGHTNO = Root.XMLNSC.Reservation.FlightDetails.FlightNumber); DECLARE ref REFERENCE TO Root.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[1]; -- Anzahl der noch freien Plätze überprüfen SET Environment.Variables.EconomyClassRemain = CAST(Environment.Variables.TOTALECONOMIC AS INTEGER); SET Environment.Variables.FirstClassRemain = CAST(Environment.Variables.TOTALFIRST AS INTEGER); -- Anforderung in einer Schleife durchlaufen, Passagiere zählen und Kapazität überprüfen SET Environment.Variables.NoPassengers = 0; WHILE LASTMOVE(ref) DO -- überprüfen, ob REFERENCE noch gültig ist 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; -- increment the loop condition END WHILE; -- update the database with the decreased seat availability for the flight 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.XMLNSC.Reservation.FlightDetails.FlightDate AND T.FLIGHTNO = Root.XMLNSC.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; -- Reservierungsnummer generieren (eindeutig) SET resno = (InputRoot.XMLNSC.Reservation.FlightDetails.FlightNumber || InputRoot.XMLNSC.Reservation.FlightDetails.FlightDate || CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR)); -- Zeile in Datenbank einfügen, um die Reservierung verfolgen zu können INSERT INTO Database.XMLPASSENGERTB (LASTNAME, FIRSTNAME, FLIGHTNO, FLIGHTDATE, CLASSTYPE, RESERVATIONNO) VALUES(InputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[I].LastName, InputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[I].FirstName, InputRoot.XMLNSC.Reservation.FlightDetails.FlightNumber, InputRoot.XMLNSC.Reservation.FlightDetails.FlightDate, InputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[I].Class, resno); -- Reservierungnummer in der Ausgabenachricht melden SET OutputRoot.XMLNSC.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.XMLNSC.Reservation.Request = 'M' THEN RETURN TRUE; END IF; IF Root.XMLNSC.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.XMLNSC.Reservation = NULL; SET OutputRoot.XMLNSC.PassengerReservationResponse.ListOfConfirmations.ClassF.Confirmation[] = (SELECT X.FirstName, X.LastName AS Surname, X.ReservationNumber FROM InputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[] AS X WHERE UPPER(X.Class) = 'F'); SET OutputRoot.XMLNSC.PassengerReservationResponse.ListOfConfirmations.ClassY.Confirmation[] = (SELECT X.FirstName, X.LastName AS Surname, X.ReservationNumber FROM InputRoot.XMLNSC.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.XMLNSC.Reservation = NULL; SET OutputRoot.XMLNSC.PassengerReservationResponse.ListOfConfirmations.Confirmation = InputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[I]; PROPAGATE; SET I = I + 1; END WHILE; RETURN FALSE; -- Rückgabe von 'false' stoppt automatische Weitergabe END; END MODULE;
( (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.
Bei Verwendung der Anweisung CARDINALITY innerhalb einer WHILE-Schleife verringert sich die Effizienz 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 Mustercodes 'Airline Reservations' die Umgebungsbaumstruktur. In einer realen Geschäftssituation ist dies ist jedoch nicht die bevorzugte Vorgehensweise.
Speichern Sie den Nachrichtenfluss.
Zurück zur Erstellung des Mustercodes 'Airline Reservations'