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 unter Nachrichtenfluss erstellen.
  2. Fügen Sie im Nachrichtenflusseditor die in der folgenden Tabelle aufgelisteten Knoten hinzu, und benennen Sie diese um.
    Eine Anleitung hierfür finden Sie im Abschnitt Knoten hinzufügen.
    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
  3. Verbinden Sie die Knoten anhand der nachfolgenden Tabelle miteinander.
    Eine Anleitung hierfür finden Sie im Abschnitt Knoten verbinden.
    Überprüfen Sie anhand der Abbildung unter Informationen zum Nachrichtenfluss 'XML_Reservation', ob Sie die Knoten richtig miteinander verbunden haben.
    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
  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.
    Eine Anleitung hierfür finden Sie im Abschnitt Knoten konfigurieren.
    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.)
  5. Klicken Sie im Projekt 'XML-Nachrichtenflüsse für Airline' doppelt auf das ESQL-Dateiprojekt, um es im ESQL-Editor zu öffnen, und kopieren Sie folgende ESQL-Code-Module in die ESQL-Datei. Weitere Informationen hierzu finden Sie im Abschnitt ESQL entwickeln.
    -- ************************************************
    -- * 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;
  6. Klicken Sie jeden der Rechen-, Datenbank- und Filterknoten mit der rechten Maustaste an, und klicken Sie anschließend auf Properties (Eigenschaften), um den Eigenschaften-Dialog zu öffnen. Geben Sie im Feld ESQL Module (ESQL-Modul) den Namen des Moduls in der ESQL-Datei an, der diesem Knoten zugeordnet werden muss. Geben Sie beispielsweise für den Knoten 'Propagate Multiple Messages' (Mehrere Nachrichten weitergeben) PropagateMultipleMessages ein; dies ist der Name des Moduls in dem ESQL-Code, den Sie in die ESQL-Datei eingefügt haben. Klicken Sie auf OK, um den Dialog zu schließen.

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.

Symbol Hauptseite   Zurück zu "Das Beispielprogramm 'Airline Reservations' erstellen"