Crear el flujo de mensajes XML_Reservation

Utilice las siguientes instrucciones para crear el flujo de mensajes XML_Reservation. Para obtener instrucciones más detalladas, pulse en los enlaces que se proporcionan al final de cada paso.

Para crear y configurar el flujo de mensajes XML_Reservation:

  1. Cree un nuevo flujo de mensajes denominado XML_Reservation.
    Para obtener instrucciones, consulte Crear un flujo de mensajes.
  2. En el editor de flujos de mensajes, añada y renombre los nodos que se listan en la siguiente tabla.
    Para obtener instrucciones, consulte Añadir un nodo.
    Tipo de nodo Nombre de nodo
    MQInput XML_RESERVATION_IN
    MQOutput XML_RESERVATION_OUT
    MQOutput XML_RESERVATION_FAIL
    Compute UpdatePassengerTable
    Compute BuildSingleMessage
    Compute PropagateMultipleMessages
    Database UpdateFlightTable
    Filter MultipleOrSingleMessage
    Throw InvalidRequest
    Trace LogException
  3. Conecte los nodos tal como se muestra en la siguiente tabla.
    Para obtener instrucciones, consulte Conectar nodos.
    Para comprobar que haya conectado los nodos correctamente, consulte la figura en Acerca del flujo de mensajes XML_Reservation.
    Nombre de nodo Terminal Conectar a este nodo
    XML_RESERVATION_IN Out (de salida) UpdateFlightTable
    Catch (de captación) XML_RESERVATION_FAIL
    UpdateFlightTable Out (de salida) UpdatePassengerTable
    UpdatePassengerTable Out (de salida) MultipleOrSingleMessage
    MultipleOrSingleMessage Unknown (desconocido) InvalidRequest
    False BuildSingleMessage
    True PropagateMultipleMessages
    BuildSingleMessage Out (de salida) XML_RESERVATION_OUT
    PropagateMultipleMessages Out (de salida) XML_RESERVATION_OUT
    XML_RESERVATION_FAIL Out (de salida) LogException
  4. Configure las propiedades del nodo, tal como se muestra en la siguiente tabla. Acepte los valores por omisión para todas las propiedades, a menos que en la tabla se muestre un valor alternativo.
    Para ver las instrucciones, consulte el apartado Configurar un nodo.
    Nombre de nodo Página Propiedad Valor
    XML_RESERVATION_IN Básico Nombre de cola XML_RESERVATION_IN
    (Esta es la cola local desde la que el flujo de mensajes toma el mensaje.)
    Valor por omisión Dominio del mensaje XML
    (Indica al intermediario que utilice el analizador XML genérico.)
    UpdateFlightTable Básico Origen de datos RESERVDB
    (Esta es la base de datos que utiliza este nodo.)
    Básico Sentencia UpdateFlightTable
    (Este es el nombre del módulo ESQL que utiliza este nodo durante el proceso. El nombre ha de coincidir con el nombre que aparece en la sentencia CREATE DATABASE en el archivo ESQL.)
    UpdatePassengerTable Básico Origen de datos RESERVDB
    (Esta es la base de datos que utiliza este nodo.)
    Básico Módulo ESQL UpdatePassengerTable
    (Este es el nombre del módulo ESQL que utiliza este nodo durante el proceso. El nombre ha de coincidir con el nombre que aparece en la sentencia CREATE COMPUTE en el archivo ESQL.)
    XML_RESERVATION_OUT Básico Nombre de cola
    (No es necesario especificar el nombre del gestor de colas porque la cola está definida en el mismo gestor de colas que el intermediario.)
    XML_RESERVATION_OUT
    (Esta es la cola local en la que el flujo de mensajes coloca el mensaje.)
    LogException Básico Destino Anotaciones de error locales
    (Indica al nodo que anote la información de rastreo en las anotaciones de error locales. En Windows, las anotaciones de error locales son el Visor de sucesos; en Linux, las anotaciones de error locales son el syslog.)
    Básico Patrón 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}

    (Extrae la información de fecha y hora e información sobre el error de la lista de excepciones.)
    Básico Número del mensaje 3052
    XML_RESERVATION_FAIL Básico Nombre de cola
    (No es necesario especificar el nombre del gestor de colas porque la cola está definida en el mismo gestor de colas que el intermediario.)
    XML_RESERVATION_FAIL
    (Es donde el flujo de mensajes coloca el mensaje si el proceso falla.)
  5. En el proyecto de flujos de mensajes de Reserva de vuelos XML, efectúe una doble pulsación en el proyecto de archivo ESQL para abrirlo en el editor ESQL y, a continuación, copie y pegue los siguientes módulos de código ESQL en el archivo ESQL. Si desea ver más información, consulte el apartado Desarrollar ESQL.
    -- ************************************************
    -- * ESQL para el flujo de mensajes XML_Reservation
    -- *******************************************************
    
    CREATE DATABASE MODULE UpdateFlightTable
    	CREATE FUNCTION Main() RETURNS BOOLEAN
    	BEGIN
    		-- llenar el entorno con información del vuelo procedente de la base de datos
    		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];
    		-- track the remaining number of seats
    		SET Environment.Variables.EconomyClassRemain = CAST(Environment.Variables.TOTALECONOMIC AS INTEGER);
    		SET Environment.Variables.FirstClassRemain = CAST(Environment.Variables.TOTALFIRST AS INTEGER);
    
    		-- efectuar un bucle a través de la petición, contando los pasajeros y comprobando la capacidad
    		SET Environment.Variables.NoPassengers = 0;
    		WHILE LASTMOVE(ref) DO -- comprobar si la REFERENCE sigue siendo válida
    			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; -- incrementar la condición de bucle
    		END WHILE;
    		
    		-- actualizar la base de datos con la disponibilidad de asientos reducida
    		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 -- efectuar un bucle a través de los pasajeros
    			SET Environment.Variables.RESERVATIONSEQNO = Environment.Variables.RESERVATIONSEQNO + 1;
    			-- generar el número de reservas (único)
    			SET resno = (InputRoot.XML.Reservation.FlightDetails.FlightNumber ||
    						 InputRoot.XML.Reservation.FlightDetails.FlightDate ||
    						 CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR));
    			-- insertar una fila en la base de datos para efectuar un seguimiento de esta reserva
    			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);
    			-- informar del número de reservas en el mensaje de salida
    			SET OutputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].ReservationNumber = resno;
    			SET I = I + 1;
    		END WHILE;
    
    		-- actualizar el número de secuencia en la base de datos
    		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; -- si se devuelve false, se detiene la propagación automática
    	END;
    END MODULE;
  6. Para cada uno de los nodos Compute, Database y Filter, pulse el botón derecho del ratón en el nodo y después pulse en Propiedades para abrir el diálogo Propiedades. En el campo Módulo SQL, escriba el nombre del módulo en el archivo ESQL que ha de asociarse a dicho nodo. Por ejemplo, para el nodo Propagate Multiple Messages, escriba PropagateMultipleMessages, que es el nombre del módulo en el ESQL que pegó el archivo ESQL. Pulse en Aceptar para cerrar el diálogo.

ESQL utiliza el árbol Entorno para llevar datos, aunque este método no sea necesariamente el que se tiene que utilizar para alcanzar el mismo resultado en una situación empresarial real. La segunda sentencia SET en el módulo ESQL UpdateFlightTable rellena la carpeta Environment.Variables con los elementos (datos) extraídos de la tabla de vuelos (XMLFLIGHTTB). Los nombres de los elementos en la carpeta se heredan de los nombres de columna de la tabla de vuelos (XMLFLIGHTTB). La sentencia genera el siguiente árbol Entorno. Para más información sobre el árbol Entorno, consulte el apartado Árbol de mensaje lógico.

(
   (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
   )
)

El módulo UpdateFlightTable usa la referencia dinámica de campo REFERENCE y la sentencia MOVE (vea las sentencias que empiezan por DECLARE ref REFERENCE TO y While LASTMOVE(ref)) en vez de la sentencia CARDINALITY para acceder a las estructuras repetitivas del árbol de mensaje. Las variables de referencia de campo son más eficaces cuando se accede a estructuras repetitivas.

Si se utiliza CARDINALITY dentro de un bucle WHILE, disminuye el rendimiento del flujo de mensajes. Cuando se utiliza CARDINALITY en un bucle, aumenta la actividad general porque cada vez que se ejecuta la sentencia CARDINALITY, cuenta el número de instancias en la matriz.

Este ESQL utiliza el árbol Entorno para transportar los datos para el ejemplo de Reserva de vuelos. Este método no es necesariamente el que se utilizaría para conseguir el resultado en una situación empresarial real.

Acaba de crear el flujo de mensajes XML_Reservation, que reserva asientos en un vuelo y crea mensajes de respuesta para confirmar que se han hecho las reservas.

Icono de la página principal   Volver al ejemplo Crear el ejemplo Reserva de vuelos