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:
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 |
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 |
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.) |
-- ************************************************ -- * 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;
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.