Utilize as instruções a seguir para criar o fluxo de mensagens XML_Reservation. Para obter instruções mais detalhadas, clique nos links fornecidos no final de cada etapa.
Para criar e configurar o fluxo de mensagens XML_Reservation:
Tipo de Nó | Nome do Nó |
---|---|
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 |
Nome do Nó | Terminal | Conectar a esse Nó |
---|---|---|
XML_RESERVATION_IN | Out | UpdateFlightTable |
Catch | XML_RESERVATION_FAIL | |
UpdateFlightTable | Out | UpdatePassengerTable |
UpdatePassengerTable | Out | MultipleOrSingleMessage |
MultipleOrSingleMessage | Desconhecido | InvalidRequest |
False | BuildSingleMessage | |
True | PropagateMultipleMessages | |
BuildSingleMessage | Out | XML_RESERVATION_OUT |
PropagateMultipleMessages | Out | XML_RESERVATION_OUT |
XML_RESERVATION_FAIL | Out | LogException |
Nome do Nó | Ativo | Propriedade | Valor |
---|---|---|---|
XML_RESERVATION_IN | Básico | Nome da Fila | XML_RESERVATION_IN (Essa é a fila local de onde o fluxo de mensagens obtém a mensagem.) |
Padrão | Domínio de mensagem | XML
(Isso instrui o intermediário a utilizar o analisador XML genérico.) |
|
UpdateFlightTable | Básico | Origem de dados | RESERVDB (Esse é o banco de dados utilizado por esse nó). |
Básico | Instrução | UpdateFlightTable (Esse é o nome do módulo ESQL utilizado por esse nó durante o processamento. O nome deve corresponder ao nome na instrução CREATE DATABASE MODULE no arquivo ESQL). |
|
UpdatePassengerTable | Básico | Origem de dados | RESERVDB (Esse é o banco de dados utilizado por esse nó). |
Básico | Módulo ESQL | UpdatePassengerTable (Esse é o nome do módulo ESQL utilizado por esse nó durante o processamento. O nome deve corresponder ao nome na instrução CREATE COMPUTE MODULE no arquivo ESQL). |
|
XML_RESERVATION_OUT | Básico | Nome da Fila (Não é necessário especificar o nome do Gerenciador de Filas, porque a fila está definida no mesmo gerenciador de filas que o intermediário.) |
XML_RESERVATION_OUT (Essa é a fila local na qual o fluxo de mensagens coloca a mensagem.) |
LogException | Básico | Destino | Local Error Log (Isso instrui o nó a gravar as informações de rastreio no registro de erros local. No Windows, o registro de erros local é o Visualizador de Eventos; no Linux, o registro de erros local é syslog). |
Básico | Padrão | A data é: ${EXTRACT (MONTH FROM CURRENT_DATE)}/ ${EXTRACT (DAY FROM CURRENT_DATE)}/ ${EXTRACT (YEAR FROM CURRENT_DATE)} A hora é: ${EXTRACT (HOUR FROM CURRENT_TIMESTAMP)}: ${EXTRACT(MINUTE FROM CURRENT_TIMESTAMP)} O ambiente é: ${Environment} A Lista de Exceções é: ${ExceptionList} (Extrai as informações de data e hora e as informações sobre o erro a partir da Lista de Exceções). |
|
Básico | Número da Mensagem | 3052 | |
XML_RESERVATION_FAIL | Básico | Nome da Fila (Não é necessário especificar o nome do gerenciador de filas, porque a fila está definida no mesmo gerenciador de filas que o intermediário.) |
XML_RESERVATION_FAIL (É onde o fluxo de mensagens coloca a mensagem se o processamento falhar.) |
-- ************************************************ -- * ESQL para o fluxo de mensagens XML_Reservation -- ************************************************ CREATE DATABASE MODULE UpdateFlightTable CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- populate the environment with flight info from the database 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); -- loop through the request, counting the passengers and checking capacity 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; -- increment the loop condition END WHILE; -- update the database with the decreased seat availability for the flight 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; -- generate the reservation number (unique) SET resno = (InputRoot.XML.Reservation.FlightDetails.FlightNumber || InputRoot.XML.Reservation.FlightDetails.FlightDate || CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR)); -- insert a row into the database to track this reservation 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); -- report the reservation number in the output message SET OutputRoot.XML.Reservation.ListOfPassengers.PassengerDetails[I].ReservationNumber = resno; SET I = I + 1; END WHILE; -- update the sequence number in the database 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; -- returning false stops automatic propagation END; END MODULE;
O ESQL utiliza a árvore Environment para transportar dados, embora isso não seja necessariamente a forma como você alcançaria os mesmos resultados em uma situação de negócio realística. A segunda instrução SET no módulo UpdateFlightTable ESQL preenche a pasta Environment.Variables com os elementos (dados) extraídos a partir da tabela de vôos (XMLFLIGHTTB). Os nomes dos elementos da pasta são herdados dos nomes das colunas da tabela de vôos (XMLFLIGHTTB). A instrução gera a árvore Environment a seguir. Para obter informações adicionais sobre a árvore Ambiente, consulte Árvore de Mensagens Lógicas
( (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 ) )
O módulo UpdateFlightTable utiliza a referência dinâmica de campo REFERENCE e a instrução MOVE (consulte as instruções que começam com DECLARE ref REFERENCE TO e While LASTMOVE(ref)) em vez da instrução CARDINALITY para acessar estruturas repetitivas na árvore Mensagem. As variáveis de referência de campo são mais eficientes ao acessar estruturas de repetição.
Se CARDINALITY for utilizado com um loop WHILE, reduzirá a eficiência do desempenho do fluxo de mensagens. A sobrecarga de utilização de CARDINALITY em um loop aumenta porque sempre que a instrução CARDINALITY é executada, ela conta o número de instâncias na matriz.
Esse ESQL utiliza a árvore Ambiente para carregar dados para as finalidades da amostra Reservas Aéreas. Não é dessa forma necessariamente que você obteria os resultados em uma situação real de negócios.
Agora, você criou o fluxo de mensagens XML_Reservation, que reserva assentos em um vôo e constrói mensagens de resposta para confirmar que a reservas foram feitas.