XML_Reservation 메시지 플로우를 작성하려면 다음 지시사항을 따르십시오. 자세한 정보는 각 단계의 끝에서 제공되는 링크를 누르십시오.
XML_Reservation 메시지 플로우를 작성하고 구성하려면 다음을 수행하십시오.
노드 유형 | 노드 이름 |
---|---|
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 |
노드 이름 | 터미널 | 연결할 노드 |
---|---|---|
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 |
노드 이름 | 페이지 | 등록 정보 | 값 |
---|---|---|---|
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 (처리에 실패할 경우 메시지 플로우가 메시지를 넣는 곳입니다.) |
-- ************************************************ -- * 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;
이 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 TO 및 While LASTMOVE(ref)를 시작하는 명령문 참조)을 사용합니다. 필드 참조 변수는 반복 구조에 액세스할 때 더 효율적입니다.
CARDINALITY가 WHILE 루프에서 사용되는 경우 메시지 플로우의 성능 효율성이 감소됩니다. CARDINALITY문이 실행될 때마다 배열에 있는 인스턴스의 수를 세므로 루프에서 CARDINALITY를 사용하는 오버헤드가 증가합니다.
이 ESQL은 환경 트리를 사용하여 Airline Reservations 샘플에 사용할 데이터를 전달합니다. 실제 비즈니스 상황에서 결과를 얻는 데 꼭 필요하지는 않습니다.
이제, 항공기에 좌석을 예약하고 예약되었음을 확인하는 응답 메시지를 빌드하는 XML_Reservation 메시지 플로우가 작성되었습니다.