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:
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 |
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 |
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 |
|
UpdatePassengerTable | Básicas | Origen de datos | RESERVDB |
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 |
PropagateMultipleMessages | Básicas | Módulo ESQL | PropagateMultipleMessages |
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.) |
-- ************************************************ -- * 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;
( (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.
Guarde el flujo de mensajes.