Nachrichtenfluss 'XML_Reservation' erstellen

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':

  1. Erstellen Sie einen Nachrichtenfluss namens 'XML_Reservation'.
    Anweisungen hierzu finden Sie in der Dokumentation zu WebSphere Message Broker im Abschnitt Nachrichtenfluss erstellen.
  2. Fügen Sie im Nachrichtenflusseditor die in der folgenden Tabelle aufgelisteten Knoten hinzu und benennen Sie diese um.
    Anweisungen hierzu finden Sie in der Dokumentation von WebSphere Message Broker im Abschnitt Nachrichtenflussknoten hinzufügen.
    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
  3. Verbinden Sie die Knoten anhand der nachfolgenden Tabelle miteinander.
    Die entsprechenden Anweisungen finden Sie in der WebSphere Message Broker-Dokumentation unter Nachrichtenflussknoten verbinden.
    Überprüfen Sie anhand des Diagramms unter Informationen zum Nachrichtenfluss 'XML_Reservation', ob Sie die Knoten richtig miteinander verbunden haben.
    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
  4. Konfigurieren Sie die Knoteneigenschaften anhand der nachfolgenden Tabelle.
    Übernehmen Sie die Standardwerte für die Eigenschaften, sofern die Tabelle keinen davon abweichenden Wert enthält.
    Anweisungen hierzu finden Sie in der Dokumentation von WebSphere Message Broker im Abschnitt Nachrichtenflussknoten konfigurieren.
    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
    (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 DATABASE MODULE in der ESQL-Datei entsprechen.)

    UpdatePassengerTable Grundeinstellung Datenquelle

    RESERVDB
    (Dieser Wert gibt die von diesem Knoten verwendete Datenbank an.)

    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
    (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 DATABASE MODULE in der ESQL-Datei entsprechen.)

    PropagateMultipleMessages Grundeinstellung ESQL-Modul

    PropagateMultipleMessages
    (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 DATABASE MODULE in der ESQL-Datei entsprechen.)

    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.)
  5. Klicken Sie im Projekt 'XML Airline Message Flows' doppelt auf die ESQL-Datei, um sie im ESQL-Editor zu öffnen. Kopieren Sie die im Folgenden wiedergegebenen ESQL-Code-Module in die ESQL-Datei und speichern Sie dann die Datei. Weitere Informationen hierzu finden Sie in der WebSphere Message Broker-Dokumentation unter ESQL erstellen.
    -- ************************************************
    -- * 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;

     

  6. Dieser ESQL-Code verwendet als Datenträger die Umgebungsbaumstruktur. 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 hierzu finden Sie in der WebSphere Message Broker-Dokumentation unter Zugriff auf die Umgebungsbaumstruktur.
    (
       (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.

  7. Speichern Sie den Nachrichtenfluss.

Sie haben den Nachrichtenfluss 'XML_Reservation' erstellt, mit dem Sitzplätze für einen Flug reserviert und Antwortnachrichten erstellt werden, mit denen bestätigt wird, dass die Reservierungen vorgenommen wurden.

Zurück zur Erstellung des Mustercodes 'Airline Reservations'