Criando o Fluxo de Mensagens XML_Reservation

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:

  1. Crie um novo fluxo de mensagens denominado XML_Reservation.
    Para obter instruções, consulte Criando um Fluxo de Mensagens.
  2. No editor Message Flow, inclua e renomeie os nós listados na tabela a seguir.
    Para obter instruções, consulte Incluindo um Nó.
    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
  3. Conecte os nós conforme mostrado na tabela a seguir.
    Para obter instruções, consulte Conectando Nós.
    Para verificar se os nós foram conectados corretamente, veja a figura em Sobre o Fluxo de Mensagens XML_Reservation.
    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
  4. Configure as propriedades do nó, conforme mostradas na tabela a seguir. Aceite os valores padrão para todas as propriedades, a menos que seja mostrado um valor alternativo na tabela.
    Para obter instruções, consulte Configurando um Nó.
    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.)
  5. No projeto XML Airline Messageflows, dê um clique duplo no projeto do arquivo ESQL para abri-lo no editor ESQL e, em seguida, copie e cole os seguintes módulos do código ESQL no arquivo ESQL. Para obter informações adicionais, consulte Desenvolvendo ESQL.
    -- ************************************************
    -- * 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;
  6. Para cada nó Compute, Database e Filter, clique com o botão direito do mouse e, em seguida, clique em Propriedades para abrir o diálogo Propriedades. No campo Módulo ESQL, digite o nome do módulo no arquivo ESQL que deve ser associado a esse nó. Por exemplo, para o nó Propagate Multiple Messages, digite PropagateMultipleMessages, que é o nome do módulo no ESQL que você colou no arquivo ESQL. Clique em OK para fechar o diálogo.

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.

Ícone Página Principal   Voltar para Construção da Amostra Reservas Aéreas