XML_Reservation 메시지 플로우 작성

XML_Reservation 메시지 플로우를 작성하려면 다음 지시사항을 따르십시오. 자세한 정보는 각 단계의 끝에서 제공되는 링크를 누르십시오.

XML_Reservation 메시지 플로우를 작성하고 구성하려면 다음을 수행하십시오.

  1. XML_Reservation이라는 새 메시지 플로우를 작성하십시오.
    지시사항은 메시지 플로우 작성을 참조하십시오.
  2. 메시지 플로우 편집기에서 다음 표에 나열된 노드를 추가하고 노드의 이름을 바꾸십시오.
    지시사항은 노드 추가를 참조하십시오.
    노드 유형 노드 이름
    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. 다음 표에 표시된 대로 노드를 서로 연결하십시오.
    지시사항은 노드 연결을 참조하십시오.
    노드가 서로 올바르게 연결되었는지 점검하려면 XML_Reservation 메시지 플로우 정보에 있는 그림을 참조하십시오.
    노드 이름 터미널 연결할 노드
    XML_RESERVATION_IN Out UpdateFlightTable
    Catch XML_RESERVATION_FAIL
    UpdateFlightTable Out UpdatePassengerTable
    UpdatePassengerTable Out MultipleOrSingleMessage
    MultipleOrSingleMessage Unknown InvalidRequest
    False BuildSingleMessage
    True PropagateMultipleMessages
    BuildSingleMessage Out XML_RESERVATION_OUT
    PropagateMultipleMessages Out XML_RESERVATION_OUT
    XML_RESERVATION_FAIL Out LogException
  4. 다음 표에 표시된 대로 노드 등록 정보를 구성하십시오. 표에 대체 값이 표시된 경우를 제외하고 모든 등록 정보의 디폴트 값을 승인하십시오.
    지시사항은 노드 구성을 참조하십시오.
    노드 이름 페이지 등록 정보
    XML_RESERVATION_IN 기본 큐 이름 XML_RESERVATION_IN
    (메시지 플로우가 메시지를 가져오는 로컬 큐입니다.)
    디폴트 메시지 도메인 XML
    (브로커에게 일반 XML 구문 분석기를 사용하도록 알려줍니다.)
    UpdateFlightTable 기본 데이터 소스 RESERVDB
    (이 노드에서 사용하는 데이터베이스입니다.)
    기본 명령문 UpdateFlightTable
    (처리 중에 이 노드에서 사용하는 ESQL 모듈의 이름입니다. 이 이름은 ESQL 파일의 CREATE DATABASE MODULE문에 있는 이름과 일치해야 합니다.)
    UpdatePassengerTable 기본 데이터 소스 RESERVDB
    (이 노드에서 사용하는 데이터베이스입니다.)
    기본 ESQL 모듈 UpdatePassengerTable
    (처리 중에 이 노드에서 사용하는 ESQL 모듈의 이름입니다. 이 이름은 ESQL 파일의 CREATE COMPUTE MODULE문에 있는 이름과 일치해야 합니다.)
    XML_RESERVATION_OUT 기본 큐 이름
    (큐가 브로커와 동일한 큐 관리자에 정의되어 있으므로 큐 관리자 이름을 지정할 필요가 없습니다.)
    XML_RESERVATION_OUT
    (메시지 플로우가 메시지를 넣는 로컬 큐입니다.)
    LogException 기본 목적지 로컬 오류 로그
    (노드에게 로컬 오류 로그에 추적 정보를 쓰도록 지시합니다. Windows에서 로컬 오류 로그는 이벤트 뷰어이고, Linux에서는 syslog입니다.)
    기본 패턴 데이터는 다음과 같습니다.
    ${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}

    (예외 목록에서 날짜 및 시간 정보와 오류에 대한 정보를 추출합니다.)
    기본 메시지 번호 3052
    XML_RESERVATION_FAIL 기본 큐 이름
    (큐가 브로커와 동일한 큐 관리자에 정의되어 있으므로 큐 관리자 이름을 지정할 필요가 없습니다.)
    XML_RESERVATION_FAIL
    (처리에 실패할 경우 메시지 플로우가 메시지를 넣는 곳입니다.)
  5. XML Airline 메시지 플로우 프로젝트에서 ESQL 파일 프로젝트를 두 번 눌러 ESQL 편집기로 열고, 다음 ESQL 코드 모듈을 ESQL 파일로 복사하여 붙여넣으십시오. 자세한 정보는 ESQL 개발을 참조하십시오.
    -- ************************************************
    -- * ESQL for the XML_Reservation message flow
    -- ************************************************
    
    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. 각 Compute, Database 및 Filter 노드에서 마우스 오른쪽 단추로 노드를 누른 후 등록 정보를 눌러 등록 정보 대화 상자를 여십시오. ESQL 모듈 필드에 해당 노드와 연관될 ESQL 파일에 있는 모듈의 이름을 입력하십시오. 예를 들어, Propagate Multiple Messages 노드의 경우 PropagateMultipleMessages를 입력하십시오. 이는 ESQL 파일에 붙여넣은 ESQL의 모듈 이름입니다. 확인을 눌러 대화 상자를 닫으십시오.

이 ESQL은 Environment 트리를 사용하여 데이터를 전달합니다. 그러나 실제 비즈니스 상황에서 동일한 결과를 얻는 데 반드시 이 방법을 사용해야 하는 것은 아닙니다. UpdateFlightTable ESQL 모듈의 두 번째 SET문은 항공기 테이블(XMLFLIGHTTB)에서 추출한 요소(데이터)로 Environment.Variables 폴더를 채웁니다. 폴더의 요소 이름은 항공기 테이블(XMLFLIGHTTB)의 열 이름에서 상속됩니다. 명령문은 다음 Environment 트리를 생성합니다. Environment 트리에 대한 자세한 정보는 논리적 메시지 트리를 참조하십시오.

(
   (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
   )
)

UpdateFlightTable 모듈은 메시지 트리에서 반복되는 구조에 액세스하기 위해 CARDINALITY문 보다는 REFERENCE 필드 동적 참조 및 MOVE문(DECLARE ref REFERENCE TOWhile LASTMOVE(ref)를 시작하는 명령문 참조)을 사용합니다. 필드 참조 변수는 반복 구조에 액세스할 때 더 효율적입니다.

CARDINALITY가 WHILE 루프에서 사용되는 경우 메시지 플로우의 성능 효율성이 감소됩니다. CARDINALITY문이 실행될 때마다 배열에 있는 인스턴스의 수를 세므로 루프에서 CARDINALITY를 사용하는 오버헤드가 증가합니다.

이 ESQL은 환경 트리를 사용하여 Airline Reservations 샘플에 사용할 데이터를 전달합니다. 실제 비즈니스 상황에서 결과를 얻는 데 꼭 필요하지는 않습니다.

이제, 항공기에 좌석을 예약하고 예약되었음을 확인하는 응답 메시지를 빌드하는 XML_Reservation 메시지 플로우가 작성되었습니다.

기본 페이지 아이콘   Airline Reservations 샘플 빌드로 돌아가기