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 en la documentación de WebSphere Message Broker.
  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 en un flujo de mensajes en la documentación de WebSphere Message Broker.
    Cajones de la paleta Tipo de nodo Nombre de nodo
    WebSphere MQ MQInput XML_RESERVATION_IN
    WebSphere MQ MQOutput XML_RESERVATION_OUT
    WebSphere MQ MQOutput XML_RESERVATION_FAIL
    Transformación Compute UpdatePassengerTable
    Transformación Compute BuildSingleMessage
    Transformación Compute PropagateMultipleMessages
    Database Database UpdateFlightTable
    Direccionamiento Filter MultipleOrSingleMessage
    Construcción Throw InvalidRequest
    Construcción Trace LogException
  3. Conecte los nodos tal como se muestra en la siguiente tabla.
    Para obtener instrucciones, consulte Conexión a nodos de flujo de mensajes en la documentación de WebSphere Message Broker.
    Para comprobar que haya conectado los nodos correctamente, consulte el diagrama Acerca del flujo de mensajes XML_Reservation.
    Nombre de nodo Terminal Conectar a este nodo
    XML_RESERVATION_IN Out UpdateFlightTable
    Catch XML_RESERVATION_FAIL
    UpdateFlightTable Out UpdatePassengerTable
    UpdatePassengerTable Out MultipleOrSingleMessage
    MultipleOrSingleMessage Unknown (desconocido) InvalidRequest
    False BuildSingleMessage
    True PropagateMultipleMessages
    BuildSingleMessage Out XML_RESERVATION_OUT
    PropagateMultipleMessages Out XML_RESERVATION_OUT
    XML_RESERVATION_FAIL Out 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 obtener instrucciones, consulte Configurar un nodo de flujo de mensajes en la documentación de WebSphere Message Broker.
    Nombre de nodo Página Propiedad Valor
    XML_RESERVATION_IN Básicas Nombre de cola XML_RESERVATION_IN
    (Este valor es la cola local desde la que el flujo de mensajes toma el mensaje.)
    Análisis de mensaje de entrada Dominio del mensaje XMLNSC : Para mensajes XML (preparado para espacio de nombres, validación, poco uso de memoria)
    (Este valor indica al intermediario que utilice el analizador XML genérico.)
    UpdateFlightTable Básicas Origen de datos RESERVDB
    (Este valor es la base de datos que utiliza este nodo.)
    Básicas Sentencia

    UpdateFlightTable
    (Sustituya el valor predeterminado)
    (Este valor 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ásicas Origen de datos

    RESERVDB
    (Este valor es la base de datos que utiliza este nodo.)

    Básicas Módulo ESQL UpdatePassengerTable
    (Sustituya el valor predeterminado)
    (Este valor 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ásicas Nombre de cola
    (No es necesario que especifique el nombre del gestor de colas porque la cola está definida en el mismo gestor de colas que el intermediario.)
    XML_RESERVATION_OUT
    (Este valor es la cola local en la que el flujo de mensajes coloca el mensaje.)
    LogException Básicas Destino Anotaciones de error locales
    (Este valor indica al nodo que escriba 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ásicas 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}

    (Este valor extrae la información de fecha y hora y la información sobre el error de la lista de excepciones.)
    Básicas Número del mensaje 3052
    MultipleOrSingleMessage Básicas Expresión de filtro MultipleOrSingleMessage
    BuildSingleMessage Básicas Módulo ESQL

    BuildSingleMessage
    (Sustituya el valor predeterminado)
    (Este valor 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.)

    PropagateMultipleMessages Básicas Módulo ESQL

    PropagateMultipleMessages
    (Sustituya el valor predeterminado)
    (Este valor 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.)

    XML_RESERVATION_FAIL Básicas Nombre de cola
    (No es necesario que especifique el nombre del gestor de colas porque la cola está definida en el mismo gestor de colas que el intermediario.)
    XML_RESERVATION_FAIL
    (Este valor es el lugar en que el flujo de mensajes coloca el mensaje si el proceso falla.)
  5. En el proyecto XML Airline Message Flows, efectúe una doble pulsación en el archivo ESQL para abrirlo en el Editor ESQL. Copie y pegue los siguientes módulos de código ESQL en el archivo ESQL y luego guarde el archivo. Para obtener más información, consulte Desarrollo de ESQL en la documentación de WebSphere Message Broker.
    -- ************************************************
    -- * 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 de la base de datos
    		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];
    		-- averiguar el número de asientos restantes
    		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 reducidos para el vuelo
    		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 -- realizar un bucle por los pasajeros
    			SET Environment.Variables.RESERVATIONSEQNO = Environment.Variables.RESERVATIONSEQNO + 1;
    			-- generar el número de reserva (exclusivo)
    			SET resno = (InputRoot.XMLNSC.Reservation.FlightDetails.FlightNumber ||
    						 InputRoot.XMLNSC.Reservation.FlightDetails.FlightDate ||
    						 CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR));
    			-- insertar una fila en la base de datos para realizar el seguimiento de esta reserva
    			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);
    			-- presentar el número de reserva en el mensaje de salida
    			SET OutputRoot.XMLNSC.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.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; -- si se devuelve false, se detiene la propagación automática
    	END;
    END MODULE;

     

  6. El ESQL utiliza el árbol Entorno para transportar los datos. 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 obtener más información, consulte Acceso al árbol de entorno en la documentación de WebSphere Message Broker.
    (
       (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 utiliza 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 mensajes. 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 la eficacia 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 Reserva de vuelos, que no es necesariamente el modo de obtener el resultado en una situación empresarial real.

  7. Guarde el flujo de mensajes.

Ha creado 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.

Volver a Acerca del Ejemplo Creación de reserva de vuelos