식을 사용하여 파이프라인을 실행하는 방법
BizTalk Server 오케스트레이션 내에서 파이프라인을 동기적으로 호출할 수 있습니다. 이에 따라 오케스트레이션은 데이터를 메시징 인프라를 통해 보내지 않고 데이터 본문에 대해 파이프라인(송신 또는 수신) 내부에 캡슐화된 메시지 처리를 사용할 수 있습니다.
이 기능을 사용하면 오케스트레이션이 송신 파이프라인을 호출하여 여러 개의 메시지를 나가는 단일 교환으로 집계할 수 있습니다. 반대로 오케스트레이션은 MessageBox를 통하지 않고 수신 파이프라인을 호출하여 메시징 인프라 외부에서 가져온 교환을 디코딩하거나 디스어셈블할 수 있습니다.
세부 정보
오케스트레이션은 XLANGPipelineManager 클래스( Microsoft.XLANGs.Pipeline 네임스페이스)의 메서드를 사용하여 송신 또는 수신 파이프라인을 호출합니다. 수신 파이프라인은 BizTalk 메시징 내부에서 메시지를 수신하는 컨텍스트에서 실행되는 것과 마찬가지로 단일 메시지 또는 교환을 사용하고 0개 이상의 메시지를 생성합니다. 수신 파이프라인은 BizTalk 메시징 내부에서 메시지를 송신하는 컨텍스트에서 실행되는 것과 마찬가지로 하나 이상의 메시지를 사용하고 단일 메시지 또는 교환을 생성합니다.
수신 파이프라인 호출
오케스트레이션 내에서 수신 파이프라인을 호출하기 위해 애플리케이션은 XLANGPipelineManager 클래스의 ExecuteReceivePipeline() 메서드를 호출합니다. 이 메서드는 단일 교환을 사용하고 0개 이상의 메시지 컬렉션을 반환합니다(ReceivePipelineOutputMessages 클래스의 instance 포함). 이 메서드의 구문은 XLANGPipelineManager 클래스에 대한 .NET 클래스 라이브러리 참조에 자세히 설명되어 있습니다.
오케스트레이션 내부에서 수신 파이프라인을 실행하는 API는 다음과 같습니다.
// Execute receive pipeline
static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);
수신 파이프라인에 대한 호출은 일반적으로 오케스트레이션 내의 식 셰이프에서 수행됩니다.
오케스트레이션 내부에서 수신 파이프라인을 호출하려면 개발자는 오케스트레이션 프로젝트에서 파이프라인 어셈블리를 참조해야 합니다. 다음은 수신 파이프라인을 호출하는 오케스트레이션의 예입니다.
자세한 예제는 SDK 샘플 작성 메시지 프로세서(BizTalk Server 샘플)를 참조하세요.
참고
ReceivePipelineOutputMessages 형식의 변수는 오케스트레이션의 원자성 scope 내에서만 선언할 수 있습니다. 이 유형의 변수는 serialize할 수 없으므로 오케스트레이션의 지속성을 따르지 못하며 오케스트레이션은 원자성 범위 내부에서 실행되는 동안 지속되지 않기 때문입니다. 따라서 수신 파이프라인은 원자성 범위 내부에서만 실행될 수 있습니다.
참고
오케스트레이션 내에서 PassThruReceive 파이프라인 또는 사용자 지정 파이프라인 구성 요소를 호출할 때 들어오는 메시지에 대한 변수 형식을 System.Xml 선언해야 합니다. 들어오는 메시지 유형에도 불구하고 XmlDocument는 XML인지 여부입니다. 따라서 들어오는 메시지가 플랫 파일 형식 메시지와 같이 XML 메시지가 아닌 경우에 이 메시지에 대한 작업을 수행하려고 하면 예외가 발생할 수 있습니다. 그 이유는 오케스트레이션 엔진이 위에 설명된 시나리오에서 모든 유형의 들어오는 메시지에 대해 System.Xml.XmlDocument를 사용하려고 하기 때문입니다.
송신 파이프라인 호출
오케스트레이션 내에서 송신 파이프라인을 호출하기 위해 애플리케이션은 XLANGPipelineManager 클래스의 ExecuteSendPipeline() 메서드를 호출합니다. 이 메서드는 하나 이상의 메시지 컬렉션을 사용하고(SendPipelineInputMessages 클래스의 instance 포함) 단일 교환을 반환합니다. 이 메서드의 구문은 XLANGPipelineManager 클래스에 대한 .NET 클래스 라이브러리 참조에 자세히 설명되어 있습니다. 송신 파이프라인을 실행하면 새 교환이 생성되므로 다음과 같이 메시지 할당 셰이프 내에서 ExecuteSendPipeline() 메서드를 호출해야 합니다.
오케스트레이션 내부에서 송신 파이프라인을 실행하는 API는 다음과 같습니다.
// Execute a send pipeline
static public ExecuteSendPipeline(System.Type sendPipelineType, SendPipelineInputMessages inputMsgs, XLANGMessage msg);
송신 파이프라인에 대한 호출은 오케스트레이션 내의 메시지 할당 셰이프에서 수행해야 합니다.
오케스트레이션 내부에서 송신 파이프라인을 호출하려면 개발자는 오케스트레이션 프로젝트에서 파이프라인 어셈블리를 참조해야 합니다. 송신 파이프라인을 호출하는 오케스트레이션의 예:
참고
기본 XMLTransmit 파이프라인을 호출할 때는 메시지 컨텍스트 속성 XMLNORM.EnvelopeSpecName을 봉투(Envelope) 스키마의 정규화된 이름으로 설정해야 합니다. 예:
MyMessage(XMLNORM.EnvelopeSpecName) = "PipelineSchemas.POEnv, PipelineSchemas, Version=1.0.0.0, Culture=nuetral, PublicKeyToken=12e5cc95621c33e8";
자세한 예제는 SDK 샘플 집계(BizTalk Server 샘플)를 참조하세요.
파이프라인 실행 - 동작 차이
오케스트레이션에서 호출될 때 송신 또는 수신 파이프라인이 실행되는 동작은 동일한 파이프라인이 메시징 인프라 내부(즉, 수신 위치 또는 송신 포트)에서 실행되는 경우와 매우 동일합니다. 그러나 아래와 같은 일부 동작 차이가 있습니다.
파이프라인 단계 내 차이
오케스트레이션 내부에서 호출되는 송신 또는 수신 파이프라인 내부에서 단계가 실행되는 동작은 BizTalk 메시징 인프라에서 파이프라인이 호출될 때 해당 단계가 실행되는 동작과 거의 동일하지만 단계별로 다음과 같은 예외가 있습니다.
어셈블러/디스어셈블러: 어셈블러 및 디스어셈블러 단계는 추적 프로필 데이터를 처리하지 않습니다.
인코더/디코더: MIME 인코더는 호스트가 연결된 호스트에서 구성된 인증서를 사용하여 메시지에 디지털 서명합니다. SMIME 인코더는 파이프라인에 전달된 메시지의 컨텍스트에 있는 인증서를 사용하여 메시지를 암호화합니다.
스키마 검사
오케스트레이션에서 파이프라인을 실행할 때 사용할 수 있는 스키마 조회 알고리즘에는 두 가지가 있습니다.
유형별 검사
이름별 검사
스키마가 중복되어 배포된 경우에 적절한 스키마를 선택하는 알고리즘의 논리는 메시징 인프라 컨텍스트에서 실행될 때 사용되는 논리와 동일합니다.
트랜잭션 파이프라인
트랜잭션 구성 요소를 호출하는 단계가 있는 파이프라인은 트랜잭션 컨텍스트를 사용할 수 없습니다. IPipelineContext.GetTransaction()에 대한 모든 호출은 NotSupportedException을 throw합니다. 이는 오케스트레이션에서 이러한 파이프라인을 실행할 수 없다는 것을 의미하는 것이 아니라 해당 파이프라인이 이러한 상황을 감지하고 처리해야 한다는 것을 의미합니다.
메시지 대상
이 컨텍스트에서는 파이프라인 구성 요소별로 메시지 대상을 제어할 수 없습니다. 컨텍스트 속성을 MessageDestination 또는 SuspendOnRoutingFailure로 설정하면 XLANGPipelineManagerException이 throw됩니다.
파이프라인 구성 요소 유형
오케스트레이션 내부에서 호출되려면 파이프라인 구성 요소은 다음에 기반을 두어야 합니다.
.NET Framework v1.1
.NET Framework v2.0
.NET Framework v3.0
.NET Framework v3.5
.NET Framework v4.0
.NET Framework v2.0
COM
제한
다음 유형의 파이프라인은 오케스트레이션 내에서 실행할 수 없습니다 .
트랜잭션 파이프라인
복구 가능한 파이프라인
BAM 인터셉터 API를 호출하는 파이프라인( NotSupportedException 이 throw됨).
동일한 파이프라인 인스턴스는 모든 분기에서 동기화된 범위에 배치되지 않는 한 병렬 셰이프의 서로 다른 분기에서 실행될 수 없습니다.
BizTalk Server 2006 SDK에 대해 빌드된 기존 파이프라인(어셈블리)
실패 모드 및 영향
BizTalk Server 메시징 인프라 내부에서 호출되었다면 메시지가 일시 중지되었을 파이프라인 실행 실패가 발생하면 대신 예외가 throw됩니다. throw된 예외는 Microsoft.XLANG.Pipeline.XLANGPipelineManagerException 형식입니다. 이렇게 throw된 예외는 호출하는 오케스트레이션 내부의 catch 블록에서 처리할 수 있습니다. 오케스트레이션이 throw된 예외를 catch하지 않으면 XLANGs 엔진이 throw된 예외의 예외 정보 텍스트를 포함하는 오류를 보고합니다.
이 예외에서는 파이프라인 구성 요소에서 생성된 오류 메시지의 서식을 지정합니다.
XLANGPipelineManagerException 클래스의 Message 속성에는 파이프라인의 실행 오류에 대한 세부 정보가 포함되어 있습니다. 이 세부 정보는 다음과 같은 형식으로 되어 있습니다.
파이프라인 <파이프라인 유형을> 실행하는 동안 오류가 발생했습니다. 오류 세부 정보 <형식 오류 메시지>입니다.
이 메시지 <에서 파이프라인 유형> 은 파이프라인 클래스의 이름이며 <형식이 지정된 오류 메시지는> 파이프라인 실행 중에 발생한 특정 오류에 대한 설명입니다.
예를 들어 오케스트레이션이 수신 파이프라인을 호출하고 파이프라인의 구성 요소가 메시지를 인식하지 못하기 때문에 해당 파이프라인의 실행이 실패하는 경우 XLANGPipelineManagerException의 속성 값은 다음과 같습니다.
XLANGPipelineManagerException 속성 | 값 |
---|---|
메시지 | 수신 파이프라인 "MyPipelines.ReceivePipeline"을 실행하는 동안 오류가 발생했습니다. 오류 세부 정보: "디스어셈블 단계 구성 요소가 데이터를 인식할 수 없습니다. |
구성 요소 | String.Empty |
또 다른 예로, 오케스트레이션이 송신 파이프라인을 호출하고 유효성 검사 실패로 인해 해당 파이프라인의 실행이 실패하는 경우 XLANGPipelineManagerException의 Message 속성에 있는 텍스트는 다음과 같습니다.
XLANGPipelineManagerException 속성 | 값 |
---|---|
메시지 | 송신 파이프라인 "MyPipelines.SendPipeline"을 실행하는 동안 오류가 발생했습니다. 오류 세부 정보: "문서의 유효성을 검사하지 못했습니다. " <요소 이름> 요소가 잘못되었습니다. 데이터 형식 'String'에 따라 값 <요소 값> 이 잘못되었습니다. 패턴 제약 조건이 실패했습니다." |
구성 요소 | “Microsoft.BizTalk.Component.XmlValidator” |