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 na documentação do WebSphere Message Broker.
  2. No editor de Fluxo de Mensagens, inclua e renomeie os nós listados na tabela a seguir.
    Para obter instruções, consulte Incluindo um nó do fluxo de mensagens na documentação do WebSphere Message Broker.
    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
  3. Conecte os nós conforme mostrado na tabela a seguir.
    Para obter instruções, consulte Conectando nós de fluxo de mensagens na documentação do WebSphere Message Broker.
    Para verificar se você conectou os nós corretamente, consulte o diagrama em Sobre o fluxo de mensagens XML_Reservation.
    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
  4. Configure as propriedades do nó, conforme mostradas na tabela a seguir.
    Aceite os valores padrão de todas as propriedades, a menos que seja mostrado um valor alternativo na tabela.
    Para obter instruções, consulte Configurando um nó do fluxo de mensagens na documentação do WebSphere Message Broker.
    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
    (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 DATABASE MODULE no arquivo ESQL).

    UpdatePassengerTable Básico Origem de dados

    RESERVDB
    (Esse valor é o banco de dados utilizado por esse nó).

    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
    (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 DATABASE MODULE no arquivo ESQL).

    PropagateMultipleMessages Básico Módulo ESQL

    PropagateMultipleMessages
    (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 DATABASE MODULE no arquivo ESQL).

    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.)
  5. No projeto Fluxos de Mensagens de Linha Aérea XML, dê um clique duplo no arquivo ESQL para abri-lo no editor ESQL. Copie e cole os seguintes módulos de código ESQL no arquivo ESQL e salve o arquivo. Para obter mais informações, consulte Desenvolvendo ESQL na documentação do WebSphere Message Broker.
    -- ************************************************
    -- * 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;

     

  6. O ESQL utiliza a árvore Ambiente para transportar dados. 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 mais informações, consulte Acessando a árvore ambiente na documentação do WebSphere Message Broker.
    (
       (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.

  7. Salve o fluxo de mensagens.

Você criou o fluxo de mensagens XML_Reservation, que reserva assentos e cria mensagens de resposta para confirmar que as reservas foram feitas.

Voltar para a amostra Construindo Reservas Aéreas