다음을 통해 공유


Conversations 샘플

이 샘플에서는 워크플로 서비스가 동일한 계약을 통해 여러 클라이언트와 병렬 대화를 가질 수 있는 방법을 보여 줍니다. 동일한 계약 및 동일한 작업에 대해 보내지지만 다른 클라이언트가 보내기 때문에 다르게 처리되어야 하는 메시지를 상호 관련시키는 방법이 제공됩니다. 병렬 대화를 수행하기 위해 이 샘플에서는 워크플로 서비스가 제공하는 대화 컨텍스트 기능을 사용합니다.

참고

이 샘플을 빌드하고 실행하려면 .NET Framework 버전 3.5가 설치되어 있어야 하며 프로젝트 및 솔루션 파일을 열려면 Visual Studio 2008이 필요합니다.

이 샘플 설정에 대한 자세한 내용은 Windows Communication Foundation 샘플의 일회 설치 절차를 참조하십시오.

또한 이 샘플에서는 워크플로 서비스와 클라이언트가 비동기적으로 통신할 수 있도록 비동기 이중 통신을 사용합니다. 이중 통신에서 두 개의 응용 프로그램은 통신이 시작되기 전에 컨텍스트를 교환해야 합니다. 대화를 시작한 서비스는 해당 메시지에 회신에서 컨텍스트를 수신합니다. 워크플로 서비스는 이 기능을 제공합니다. 수신 서비스에서 시작 서비스로의 통신을 지원하기 위해 시작 서비스는 첫 번째 메시지에서 해당 컨텍스트 정보를 보내야 합니다. 다음 그림에서는 샘플의 아키텍처를 보여 줍니다.

Conversations 샘플 아키텍처

Conversations 샘플

이 샘플에서는 다음 시나리오를 구현합니다.

고객이 주문 요청을 보내면 이 요청에 응답하기 위해 공급자는 세 개의 다른 물류업체로부터 주문 선적을 위한 견적을 받아야 합니다. 공급자는 세 개의 모든 물류업체에 메시지를 보냅니다. 각 물류업체는 동일한 계약에서 동일한 작업을 호출하여 견적을 보냅니다. 공급자 워크플로에서 변환 컨텍스트를 사용하므로 견적의 추가 처리를 위해 올바른 수신 동작에 견적을 상호 관련시킬 수 있습니다. 공급자는 모든 견적을 수신하고 최저가 견적을 선택한 다음 고객에게 보냅니다.

이 샘플에서는 다음과 같은 5개의 엔터티가 통신합니다.

  • 고객 서비스
    고객 서비스는 주문 세부 정보를 공급자에게 보내고 여기에는 나중에 공급자 서비스가 고객 서비스에 통신하기 위해 사용하는 컨텍스트도 포함됩니다. 이 기본 워크플로에는 초기 보내기 동작이 포함되어 있으며 이 동작은 구매 주문 및 컨텍스트를 페이로드로 가지는 구매 주문 요청 메시지를 보냅니다. 수신 동작은 공급자 서비스로부터 응답을 기다립니다.
    고객 서비스가 보내는 컨텍스트는 수신 동작과 연관됩니다. 보내기 동작의 "보내기 전" 처리기에는 수신 동작에서 컨텍스트를 가져오는 코드가 포함되어 있습니다. 수신 동작에는 컨텍스트를 가져오기 위해 호출되는 다음 GetContext 메서드가 포함되어 있습니다.

    private void PrepareOrder(object sender, SendActivityEventArgs e)
    {
        this.order.Amount = 1000;
        this.order.OrderId = 1234;
        this.contextToSend = this.ReceiveOrderDetails.Context;
    }
    
  • 공급자 서비스
    공급자 서비스는 세 개의 물류업체와 통신합니다. 이를 위해 공급자 서비스는 각 대화 및 비동기 이중 통신에 대한 고유한 컨텍스트 토큰의 조합을 사용합니다. 고객 및 공급자 서비스 간 통신의 메시지 본문에서 컨텍스트가 보내집니다.
    물류업체와 통신하기 전에 공급자 서비스는 먼저 고객 서비스로부터 메시지를 받습니다. 이 메시지에서 공급자 서비스는 또한 고객 서비스와 통신하는 데 사용되는 컨텍스트를 받습니다. 공급자 서비스 워크플로는 클라이언트 서비스에 메시지를 보내는 데 사용되는 Send 동작에 이 컨텍스트를 적용합니다. 다음 코드에 표시된 것처럼 이 기능을 구현하는 코드는 첫 번째 수신 동작 안에 있는 코드 동작의 코드 처리기에 있습니다.

    private void AcceptOrder(object sender, EventArgs e)
    {
        Console.WriteLine("Order Received...");
        this.supplierAck = "Order Received on " + DateTime.Now;
        this.SendOrderDetails.Context = this.customerContext;
    }
    

    공급자 서비스가 고객으로부터 메시지를 받고 나면 공급자는 세 개의 물류업체와 세 개의 병렬 대화를 시작합니다. 위의 그림에 표시된 것처럼 각 대화 분기는 SendReceive 동작을 가집니다. 각 분기의 Send 동작은 하나의 물류업체에 메시지를 보냅니다. 해당 분기의 해당 Receive 동작은 공급자의 메시지를 검색해야 합니다. 이를 위해 메시지 페이로드의 Send 동작은 페이로드에서 고유한 컨텍스트를 보내야 합니다. 그런 다음 물류업체는 견적이 있는 메시지를 다시 보낼 때 메시지 헤더에서 이 컨텍스트를 사용합니다.
    기본적으로 모든 Receive 동작에는 루트 컨텍스트가 있습니다. Receive 동작을 고유하게 만들기 위해 Receive 동작은 루트 동작이 아닌 부모 동작으로 범위가 제한되는 컨텍스트를 정의합니다. 다음 샘플에서 병렬 대화의 각 Receive 동작의 컨텍스트 토큰 속성은 고유한 이름을 가지며 자신이 포함된 병렬 동작으로 범위가 제한됩니다. 각 병렬 분기 내의 보내기 동작은 수신 동작으로부터 컨텍스트를 가져올 경우 해당 Receive 동작에 고유한 컨텍스트를 가져옵니다. 이 고유한 컨텍스트는 또한 수신 동작이 수신 대기 중인 큐의 큐 이름을 만드는 데 사용됩니다. 물류업체가 헤더에 컨텍스트가 포함된 견적을 보낼 경우 워크플로 서비스 디스패치 계층은 이를 사용하여 적절한 큐 이름을 만들고 메시지를 큐에 대기시킵니다. 그런 다음 Receive 동작은 이 메시지를 볼 수 있습니다.
    private void PrepareShipper2Request(object sender, SendActivityEventArgs e)
    {
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("RequestShippingQuote from Shipper2");
    Console.ResetColor();
    this.contextShipper2 = this.ReceiveQuoteFromShipper2.Context;
    }
    물류업체 워크플로는 공급자에서 컨텍스트와 함께 견적 요청을 받습니다. 다음 코드에 표시된 것처럼 해당 컨텍스트는 메시지를 공급자에게 보내는 보내기 동작에 적용됩니다.

    private void AcceptQuoteRequest(object sender, EventArgs e)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Received ShippingQuote Request");
        this.supplierAck = "Working on quote...";
        Console.ResetColor();
        this.SendShippingQuote.Context(this.supplierContext);
    }
    

샘플을 설치, 빌드 및 실행하려면

  1. 기본적으로 이 샘플에서는 지속성이 사용되지 않습니다. 지속성을 원할 경우 각 솔루션에 대해 App.config 파일에서 <WorkflowRuntime> 항목을 추가해야 합니다. 다음 예제와 같이 이 항목은 behaviors 섹션 아래에 있어야 합니다.

    <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="false" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=ServiceModelSamples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
  2. behaviors 섹션 아래의 <WorkflowRuntime> 항목 외에도 SQL 유지 서비스를 추가해야 합니다. Windows Communication Foundation 샘플의 일회 설치 절차 항목에 있는 CreateStores.cmd 스크립트를 실행합니다. CreateStores.cmd 스크립트는 ServiceModelSamples_ServiceWorkflowStore 데이터베이스를 만듭니다. 기본적으로 이러한 데이터베이스는 SQL Server 2005 Express Edition 데이터베이스에서 만들어집니다. SQL Server Express가 컴퓨터에 설치되었는지 확인합니다. SQL Server Express를 설치하는 대신에 SQL Server를 사용하려면 유지 데이터베이스에 대한 App.config 파일의 연결 문자열을 수정합니다.

  3. 모든 워크플로 서비스가 실행 중이면 클라이언트 워크플로에서 Enter 키를 눌러 서로 통신하는 모든 워크플로를 볼 수 있습니다. 구매 주문이 공급자에게 보내지고 공급자는 물류 견적 요청을 모든 물류업체에 보냅니다. 공급자가 견적을 받고 나면 고객에게 최저가 견적이 보내지는 것을 확인할 수 있습니다. 또한 각 경우에 컨텍스트 토큰을 확인할 수 있습니다. 이렇게 하면 각 물류업체에 보내지는 고유한 컨텍스트를 이해하는 데 도움이 됩니다.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.