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:
Gavetas de Paleta | Tipo de Nó | Nome de Nó |
---|---|---|
WebSphere MQ | MQInput | XML_RESERVATION_IN |
WebSphere MQ | MQOutput | XML_RESERVATION_OUT |
WebSphere MQ | MQOutput | XML_RESERVATION_FAIL |
Transformação | Compute | UpdatePassengerTable |
Transformação | Compute | BuildSingleMessage |
Transformação | Compute | PropagateMultipleMessages |
Banco de Dados | Banco de Dados | UpdateFlightTable |
Roteamento | Filter | MultipleOrSingleMessage |
Construção | Throw | InvalidRequest |
Construção | Rastrear | LogException |
Nome de Nó | Terminal | Conectar a esse Nó |
---|---|---|
XML_RESERVATION_IN | Out | UpdateFlightTable |
Catch | XML_RESERVATION_FAIL | |
UpdateFlightTable | Out | UpdatePassengerTable |
UpdatePassengerTable | Out | MultipleOrSingleMessage |
MultipleOrSingleMessage | Desconhecido | InvalidRequest |
Falso | BuildSingleMessage | |
True | PropagateMultipleMessages | |
BuildSingleMessage | Out | XML_RESERVATION_OUT |
PropagateMultipleMessages | Out | XML_RESERVATION_OUT |
XML_RESERVATION_FAIL | Out | LogException |
Nome de Nó | Ativo | Propriedade | Valor |
---|---|---|---|
XML_RESERVATION_IN | Básico | Nome da fila | XML_RESERVATION_IN (Esse valor é a fila local a partir da qual o fluxo de mensagens obtém a mensagem.) |
Análise de Mensagem de Entrada | Domínio de mensagem | XMLNSC: Para mensagens XML
(conhecimento de espaço de nomes, validação, baixa utilização de
memória) (Esse valor instrui o intermediário a utilizar o analisador XML genérico.) |
|
UpdateFlightTable | Básico | Origem de dados | RESERVDB (Esse valor é o banco de dados utilizado por esse nó). |
Básico | Instrução | UpdateFlightTable |
|
UpdatePassengerTable | Básico | Origem de dados | RESERVDB |
Básico | Módulo ESQL | UpdatePassengerTable (Substituir o valor padrão) (Esse valor é o nome do módulo ESQL usado 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 (Esse valor é a fila local na qual o fluxo de mensagens coloca a mensagem.) |
LogException | Básico | Destino | Log de Erros Local (Esse valor instrui o nó a gravar as informações de rastreio no log 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} (Esse valor 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 de mensagem | 3052 | |
MultipleOrSingleMessage | Básico | Expressão de Filtro | MultipleOrSingleMessage |
BuildSingleMessage | Básico | Módulo ESQL | BuildSingleMessage |
PropagateMultipleMessages | Básico | Módulo ESQL | PropagateMultipleMessages |
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 (Esse valor é 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 -- preenche o ambiente com informações sobre o vôo a partir do banco de dados 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]; -- rastreia o número de assentos restantes 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; -- incrementa a condição de loop END WHILE; -- atualiza o banco de dados com a disponibilidade de assentos decrescente para o vôo 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 -- loop através dos passageiros SET Environment.Variables.RESERVATIONSEQNO = Environment.Variables.RESERVATIONSEQNO + 1; -- gera o número de reserva (exclusivo) SET resno = (InputRoot.XMLNSC.Reservation.FlightDetails.FlightNumber || InputRoot.XMLNSC.Reservation.FlightDetails.FlightDate || CAST (Environment.Variables.RESERVATIONSEQNO AS CHAR)); -- insere uma linha no banco de dados para rastrear 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); -- relata o número da reserva na mensagem de saída SET OutputRoot.XMLNSC.Reservation.ListOfPassengers.PassengerDetails[I].ReservationNumber = resno; SET I = I + 1; END WHILE; na mensagem de saída SET OutputRoot.XMLNSC.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.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; -- retorna propagação automática de paradas falsas propagation 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 ) )
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 repetidas em uma árvore de Mensagens. As variáveis de referência de campo são mais eficientes ao acessar estruturas de repetição.
Se CARDINALITY for usada em um loop WHILE, ela reduz a eficiência do fluxo de mensagens. O gasto adicional de usar CARDINALITY em um loop aumenta porque cada vez que a instrução CARDINALITY é executada, ela conta o número de instâncias na matriz.
O ESQL utiliza a árvore de Ambiente para transportar dados por motivos de amostra da Airline Reservations, que não é necessariamente como você alcançaria o resultado em uma situação comercial real.
Salve o fluxo de mensagens.