구성된 메시지 처리기(BizTalk Server 샘플)
이 샘플은 집계된 메시지에서 개별 품목을 처리하는 구성된 메시지 프로세서 응용 프로그램을 빌드하기 위한 것입니다.
구체적으로 다음을 수행하는 오케스트레이션 일정을 빌드합니다.
여러 구매 주문으로 구성된 일괄 처리 교환 메시지를 받습니다.
교환 메시지를 개별 구매 주문 문서로 디스어셈블합니다.
각 문서를 처리하여 각 구매 주문을 송장 메시지로 변환합니다.
모든 송장 메시지를 일괄 처리 교환으로 어셈블합니다.
이 샘플에서는 단계 #3이 간소화되었습니다. 예를 들어 더 복잡한 응용 프로그램에서 오케스트레이션이 디스어셈블된 구매 주문을 다른 백 엔드 재고 시스템으로 보내고 모든 응답을 수집한 후 하나의 일괄 처리 송장 메시지로 집계합니다.
구성된 메시지 프로세서 패턴에 대한 자세한 내용은 [1]을(를) 참조하십시오.
이 샘플의 용도
샘플 솔루션 내에는 두 개의 프로젝트가 있습니다. 이 두 프로젝트에 대해서는 다음 섹션에서 자세히 설명합니다.
파이프라인 및 스키마
파이프라인 및 스키마 프로젝트에는 다음이 포함되어 있습니다.
입력 구매 주문 교환 및 출력 송장 교환에 대한 플랫 파일 스키마
구매 주문 문서를 송장 문서로 변환할 맵
수신 및 송신 파이프라인
입력 및 출력 교환에 대한 플랫 파일 스키마
샘플 응용 프로그램은 플랫 파일 형식의 교환에서 작동합니다. 구매 주문 교환 및 송장 교환 예제는 다음과 같습니다.
구매 주문 교환(CMPInput.txt):
Northwind Shipping
Batch type:Purchase Orders
PO1999-10-20
US Alice Smith 123 Maple Street Mill Valley CA 90952
US Robert Smith 8 Oak Avenue Old Town PA 95819
Hurry, my lawn is going wild!
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21
PO1999-10-21
US John Dow 123 Elm Street Mill Valley CA 90952
US July Dow 8 Pine Avenue Old Town PA 95819
Please ship it urgent!
ITEMS,ITEM398-BB|Tire|4|324.99|Wrap them up nicely,ITEM201-BB|Engine Oil|1|12.99|SAE10W30|1999-05-22
PO1999-10-23
US John Connor 123 Cedar Street Mill Valley CA 90952
US Sarah Connor 8 Grass Avenue Old Town PA 95819
Use cheapest shipping method.
ITEMS,ITEM101-TT|Plastic flowers|10|4.99|Fragile handle with care,ITEM202-RR|Fertilizer|1|10.99|Lawn fertilizer,ITEM453-XS|Weed killer|1|5.99|Lawn weed killer|1999-05-25
교환 또는 구매 주문 문서에는 포함된 문서 유형을 식별하는 헤더가 있습니다.
Northwind Shipping
Batch type:Purchase Orders
이 교환은 세 개의 구매 주문 문서로 구성됩니다. 각 인스턴스는 아래에 표시된 정보로 구성됩니다. 청구 주소 및 배송 주소, 주문한 항목 목록 등의 정보가 포함됩니다.
PO1999-10-20
US Alice Smith 123 Maple Street Mill Valley CA 90952
US Robert Smith 8 Oak Avenue Old Town PA 95819
Hurry, my lawn is going wild!
ITEMS,ITEM872-AA|Lawnmower|1|148.95|Confirm this is electric,ITEM926-AA|Baby Monitor|1|39.98|Confirm this is electric|1999-10-21
이 인스턴스에 대해 생성할 송장 교환은 다음과 같습니다.
Northwest Shipping
DocumentTypes:Invoices
INVOICE1999-10-20
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952
872-AA Lawnmower 1 148.95 Confirm this is electric
926-AA Baby Monitor 1 39.98 Confirm this is electric
INVOICE1999-10-21
BILLTO,US,John Dow,123 Elm Street,Mill Valley,CA,90952
398-BB Tire 4 324.99 Wrap them up nicely
201-BB Engine Oil 1 12.99 SAE10W30
INVOICE1999-10-20
BILLTO,US,John Connor,123 Cedar Street,Mill Valley,CA,90952
101-TT Plastic flowers 10 4.99 Fragile handle with care
202-RR Fertilizer 1 10.99 Lawn fertilizer
453-XS Weed killer 1 5.99 Lawn weed killer
이 교환에는 구매 주문 교환에 있었던 정보의 하위 집합이 포함되며 교환 형식 및 헤더 형식이 다릅니다.
헤더는 다음과 같습니다.
Northwest Shipping
DocumentTypes:Invoices
문서 인스턴스에는 다음이 포함됩니다.
INVOICE1999-10-20
BILLTO,US,Alice Smith,123 Maple Street,Mill Valley,CA,90952
872-AA Lawnmower 1 148.95 Confirm this is electric
926-AA Baby Monitor 1 39.98 Confirm this is electric
먼저 다음에 대한 플랫 파일 스키마를 만들어야 합니다.
구매 주문 문서(PO.xsd)
송장 문서(Invoice.xsd)
구매 주문 헤더(POHeader.xsd)
송장 헤더(InvoiceHeader.xsd)
이 샘플에서는 플랫 파일 스키마를 만드는 과정에 대해 설명하지 않습니다. 문서 인스턴스에서 플랫 파일 스키마를 만드는 방법을 알아보려면 "문서 인스턴스에서 플랫 파일 스키마 만들기" 설명서 섹션을 참조하십시오.
구매 주문 문서를 송장 문서로 변환할 맵
맵(PO2Invoice.btm)은 구매 주문 인스턴스를 송장 문서로 변환합니다.
수신 및 송신 파이프라인
수신 파이프라인(FFReceivePipeline.btp)에는 구매 주문 교환을 처리하는 데 사용되는 플랫 파일 디스어셈블러 구성 요소가 포함되어 있습니다. 특히 CMPInput.txt 파일에 있는 교환의 경우 수신 파이프라인은 교환 헤더를 제거하고 3개의 구매 주문에 해당하는 XML 문서 3개를 생성합니다.
수신 파이프라인의 플랫 파일 디스어셈블러는 다음과 같이 구성됩니다.
문서 스키마: PipelinesAndSchemas.PO
헤더 스키마: PipelinesAndSchemas.POHeader
헤더 유지: False
복구 가능한 교환: False
트레일러 스키마: (없음)
문서 구조 유효성 검사: False
송신 파이프라인(FFSendPipeline.btp)에는 집계된 송장 교환을 만드는 데 사용되는 플랫 파일 어셈블러 구성 요소가 포함되어 있습니다.
송신 파이프라인의 플랫 파일 어셈블러는 다음과 같이 구성됩니다.
문서 스키마: PipelinesandSchemas.Invoice
헤더 스키마: PipelinesAndSchemas.InvoiceHeader
바이트 순서 표시 유지: False
대상 문자 집합: (없음)
트레일러 스키마: (없음)
오케스트레이션 일정
오케스트레이션 일정(CMP.odx)은 모든 기본 처리가 수행되는 위치입니다. 특히 다음 작업이 수행됩니다.
수신 파이프라인이 실행되어 구매 주문 교환을 디스어셈블합니다.
수신 파이프라인의 모든 출력 메시지가 변환됩니다.
송신 파이프라인이 실행되어 송장 교환을 어셈블합니다.
오케스트레이션 일정 만들기 및 전역 변수 정의
오케스트레이션은 플랫 파일 교환을 입력으로 받고 플랫 파일 교환을 출력으로 보냅니다. 이런 이유 때문에 각각 InputInterchange와 OutputInterchange라는 입력 및 출력 메시지를 유형과 관계없는 메시지로 정의해야 합니다(예: System.Xml.XmlDocument 유형 지정).
또한 메시지를 처리할 원자성 범위를 정의해야 합니다. 수신 파이프라인은 원자성 범위 내에서 실행할 수 있기 때문에 이 작업이 필요합니다.
수신 파이프라인 실행
다음 단계에서는 오케스트레이션에서 수신된 메시지에 대해 수신 파이프라인을 실행할 논리를 추가합니다. 이렇게 하려면 먼저 범위 내에서 Microsoft.XLANGs.Pipeline.ReceivePipelineOutputMessages 유형의 변수(RcvPipeOutput)를 선언합니다. 이 변수는 수신 파이프라인 출력 메시지를 순환할 수 있는 열거자입니다. 오케스트레이션에서 파이프라인을 실행하기 위해 이 유형과 다른 모든 유형에 액세스하려면 다음 어셈블리에 대한 참조를 추가해야 합니다.
Microsoft.XLANGs.Pipeline.dll
Microsoft.BizTalk.Pipeline.dll
수신 파이프라인이 항상 실행된다는 보장은 없습니다. 메시지 형식이 잘못될 수도 있으며, 이 경우 파이프라인이 처리되지 않습니다. 오케스트레이션에서 파이프라인이 실행되지 않을 경우, catch할 수 있는 예외가 throw되며 오류 처리 논리를 수행할 수 있습니다. 파이프라인에서 throw된 예외를 catch하려면 예외 처리를 사용하여 비원자성 범위 내의 파이프라인을 실행해야 합니다. 파이프라인을 실행할 실제 코드는 해당 범위 내의 Expression 셰이프에서 호출됩니다.
ExecuteRcvPipe Expression 셰이프에서 다음 코드를 작성하여 수신 파이프라인을 실행합니다.
RcvPipeOutput = Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteReceivePipeline(typeof(PipelinesAndSchemas.FFReceivePipeline), InputInterchange);
이 코드를 자세히 분석해 보겠습니다. 실행할 수신 파이프라인 유형과 입력 메시지를 매개 변수로 사용하는 정적 메서드 ExecuteReceivePipeline을 호출하기 때문에 이 코드는 출력 메시지 집합을 사용하여 열거자 개체를 생성합니다. 결과는 앞에서 이 범위에 정의된 ReceivePipelineOutputMessages 유형의 변수에 할당됩니다.
또한 파이프라인 실행 범위에 대한 예외 처리 블록을 포함했습니다. 이 블록은 XLANGPipelineManagerException 유형의 예외를 catch한 다음 단순한 구현을 위해 사용자 지정 오류 메시지를 사용하여 오케스트레이션 인스턴스를 종료합니다.
더 복잡한 시나리오에서는 오류 알림 메시지를 생성하고 비즈니스 사용자나 관리자에게 전자 메일로 보내는 등의 추가 오류 처리를 여기서 수행할 수 있습니다.
파이프라인 출력 메시지 변환
파이프라인이 실행되고 디스어셈블된 메시지 집합이 생성된 후 각 출력 메시지를 다른 형식으로 변환해야 합니다.
오케스트레이션에서 변환을 사용하려면 변환 입력과 출력의 두 메시지를 정의해야 합니다. 원자성 범위 내에서 이러한 메시지를 정의합니다. TmpMessageIn이라는 변환 입력 메시지는 PipelinesAndSchemas.PO 형식입니다. TmpMessageOut이라는 변환 출력 메시지는 PipeliensAndSchemas.Invoice 형식입니다. 프로젝트 PipelinesAndSchemas에 정의된 맵 PO2Invoice.btm을 적용합니다.
각 파이프라인 출력 메시지를 매핑하려고 하기 때문에 반복해서 변환을 수행해야 합니다. 아래와 같이 종료하기 위해 Loop 셰이프를 조건과 함께 사용합니다.
RcvPipeOutput.MoveNext()
MoveNext() 메서드는 파이프라인 출력 메시지 컬렉션 내에서 이동할 수 있도록 하는 IEnumerator .NET 인터페이스의 표준 메서드입니다. 메서드가 컬렉션 끝에 도달하면 false가 반환됩니다.
첫 번째 Construct 셰이프는 파이프라인 출력 메시지에서 오케스트레이션 메시지 TmpMessageIn을 생성하는 데 사용됩니다.
Construct 셰이프의 코드:
TmpMessageIn = null;
RcvPipeOutput.GetCurrent(TmpMessageIn);
이 코드에서는 먼저 오케스트레이션 메시지를 null로 초기화한 다음 파이프라인 출력 메시지 컬렉션에서 현재 메시지로 설정합니다.
두 번째 Construct 셰이프에서는 TmpMessageIn의 실제 변환이 수행되고 PipelinesAndSchemas.Invoice 유형의 TmpMessageOut이 생성됩니다.
송신 파이프라인 실행
오케스트레이션의 마지막 처리 단계에서는 플랫 파일 송신 파이프라인을 실행하여 변환된 모든 xml 메시지를 하나의 플랫 파일 교환으로 어셈블합니다.
송신 파이프라인을 실행하려면 송신 파이프라인에서 처리해야 하는 오케스트레이션 메시지 컬렉션을 포함할 Microsoft.XLANGs.Pipeline.SendPipelineInputMessages 유형의 변수를 사용해야 합니다. 이 변수의 이름은 SendPipeInput입니다.
변환을 수행한 루프의 마지막 식에서는 송신 파이프라인에 대한 메시지 컬렉션에 변환된 각 메시지를 추가할 코드를 작성합니다.
SendPipeInput.Add(TmpMessageOut);
수신 파이프라인을 실행하는 파트와 마찬가지로, 송신 파이프라인 실행 코드는 예외 처리 블록이 있는 비원자성 범위 내에 배치됩니다. 송신 파이프라인 실행 코드는 생성 블록의 Message Assignment 셰이프에 있습니다.
OutputInterchange = null;
Microsoft.XLANGs.Pipeline.XLANGPipelineManager.ExecuteSendPipeline(typeof(PipelinesAndSchemas.FFSendPipeline), SendPipeInput, OutputInterchange);
생성 블록은 유형과 관계없는(예: System.Xml.XmlDocument) 파이프라인 출력 메시지 OutputInterchange를 생성하는 데 사용됩니다. Message Assignment 셰이프에서 새로 생성된 메시지가 null로 초기화됩니다. 그런 후에 정적 메서드 ExecuteSendPipeline이 호출되어 송신 파이프라인을 실행합니다. 이 메서드는 실행할 송신 파이프라인의 유형, 입력 메시지 및 파이프라인 출력이 저장될 출력 메시지에 대한 참조를 매개 변수로 사용합니다.
수신 파이프라인의 실행과 마찬가지로, 여기에도 파이프라인 실행 범위에 대한 예외 처리 블록이 있습니다. 이 블록은 XLANGPipelineManagerException 유형의 예외를 catch한 다음 단순한 구현을 위해 사용자 지정 오류 메시지를 사용하여 오케스트레이션 인스턴스를 종료합니다.
이 샘플이 있는 위치
다음 표에는 이 샘플의 파일이 나열되어 있습니다.
파일 | Description |
---|---|
Cleanup.bat | 어셈블리의 배포를 취소하고 GAC(전역 어셈블리 캐시)에서 어셈블리를 제거하는 데 사용됩니다. 송신 및 수신 포트를 제거합니다. 필요한 경우 Microsoft IIS(인터넷 정보 서비스) 가상 디렉터리를 제거합니다. |
ComposedMessageProcessor.sln | 샘플의 Visual Studio 솔루션 파일입니다. |
ComposedMessageProcessorBinding.xml | 샘플의 바인딩 파일입니다. |
Setup.bat | 이 샘플을 빌드 및 초기화하는 데 사용됩니다. |
오케스트레이션 폴더: CMP.odx |
디스어셈블러 메시지에 대해 수신 파이프라인을 실행하는 오케스트레이션이 디스어셈블된 각 메시지를 변환한 다음 송신 파이프라인을 실행하여 메시지를 교환으로 어셈블합니다. |
오케스트레이션 폴더: Orchestration.btproj |
오케스트레이션에 대한 BizTalk 프로젝트입니다. |
오케스트레이션 폴더: SuspendMessage.odx |
파이프라인 처리에 실패한 메시지를 일시 중단하는 데 사용되는 오케스트레이션입니다. |
PipelinesAndSchemas 폴더: CMPInput.xml, CMPOutput.xml |
샘플의 입력 및 출력 문서 인스턴스입니다. |
PipelinesAndSchemas 폴더: FFReceivePipeline.btp, FFSendPipeline.btp |
플랫 파일 구성 요소가 있는 수신 및 송신 파이프라인입니다. 이러한 파이프라인은 오케스트레이션 내에서 실행됩니다. |
PipelinesAndSchemas 폴더: Invoice.xsd, InvoiceHeader.xsd |
출력 문서 및 헤더에 대한 플랫 파일 스키마입니다. |
PipelinesAndSchemas 폴더: PO.xsd, POHeader.xsd |
입력 문서 및 헤더에 대한 플랫 파일 스키마입니다. |
PipelinesAndSchemas 폴더: PropertySchema.xsd |
샘플에 대한 속성 스키마입니다. |
샘플 빌드 및 초기화
다음 절차에 따라 Compose 샘플을 빌드 및 초기화합니다.
Compose 샘플을 빌드하고 초기화하려면 다음을 수행하십시오.
명령 창에서 다음 폴더로 이동합니다.
<샘플 경로>\Pipelines\ComposedMessageProcessor
다음 작업을 수행하는 Setup.bat 파일을 실행합니다.
이 샘플에 대한 입력(In) 및 출력(Out) 폴더를 다음 폴더에 만듭니다.
<샘플 경로>\Pipelines\ComposedMessageProcessor
이 샘플에 대한 Visual Studio 프로젝트를 컴파일합니다.
"CMP Sample"이라는 새 응용 프로그램을 만들고 샘플 어셈블리를 배포합니다.
BizTalk Server 수신 위치와 송신 및 수신 포트를 만들고 바인딩합니다.
오케스트레이션을 등록 및 시작하고 수신 위치를 사용하도록 설정한 후에 송신 포트를 시작합니다.
Setup.bat 파일을 실행하지 않은 채 이 샘플에서 프로젝트를 열고 빌드하려는 경우 먼저 .NET Framework Strong Name 유틸리티(sn.exe)를 사용하여 강력한 이름 키 쌍을 만들어야 합니다. 이 키 쌍을 사용하여 결과 어셈블리에 서명합니다.
이 샘플을 실행하기 전에 빌드 및 초기화 프로세스에서 BizTalk Server가 오류를 보고하지 않았는지 확인합니다.
Setup.bat가 변경한 내용을 실행 취소하려면 다음을 수행해야 합니다.
BizTalk Server 관리 콘솔에서 호스트 인스턴스를 중지했다가 다시 시작합니다.
Cleanup.bat를 실행합니다. Setup.bat를 두 번째로 실행하기 전에 Cleanup.bat를 실행해야 합니다.
샘플 실행
다음 절차에 따라 ComposedMessageProcessor 샘플을 실행합니다.
ComposedMessageProcessor 샘플을 실행하려면 다음을 수행하십시오.
PipelinesAndSchemas 폴더에 있는 텍스트 파일 CMPInput.txt 복사합니다. 파일을 In 폴더에 붙여 넣습니다.
Out 폴더에서 만든 텍스트 파일을 확인합니다. 이 파일은 CMPInput.txt 동일한 레코드를 포함하지만 파일의 데이터 형식은 다릅니다.
메시지가 BizTalk Server를 통과할 때 다음 작업이 수행됩니다.
메시지가 디스어셈블되어 XML 메시지로 변환됩니다. 각 메시지가 다른 형식에 매핑됩니다.
매핑된 모든 메시지가 함께 어셈블되어 플랫 파일 형식으로 변환됩니다.