WorkflowIdentity 및 버전 관리 사용

WorkflowIdentity는 워크플로 애플리케이션 개발자에게 이름 및 Version을 워크플로 정의에 연결하는 방법을 제공하며, 이러한 정보는 지속형 워크플로 인스턴스와 연결됩니다. 이 ID 정보는 워크플로 애플리케이션 개발자가 여러 버전의 워크플로 정의를 side-by-side로 실행하는 경우와 같은 시나리오를 가능하도록 하는 데 사용될 수 있으며 동적 업데이트와 같은 다른 기능의 토대를 제공합니다. 이 항목에서는 WorkflowIdentity 호스팅과 함께 WorkflowApplication를 사용하는 방법을 간단하게 설명합니다. 워크플로 서비스에서 워크플로 정의를 side-by-side로 실행하는 방법에 대한 자세한 내용은 WorkflowServiceHost의 Side by Side 버전 관리를 참조하세요. 동적 업데이트에 대한 자세한 내용은 동적 업데이트를 참조하세요.

이 항목의 내용

WorkflowIdentity 사용

WorkflowIdentity를 사용하려면 인스턴스를 만들어 구성한 다음 WorkflowApplication 인스턴스에 연결합니다. WorkflowIdentity 인스턴스에는 세 가지 식별 정보가 포함됩니다. 필수 요소인 NameVersion에는 이름과 Version이 포함되며, 선택적인 Package는 어셈블리 이름 등의 정보나 원하는 다른 정보를 포함하는 추가 문자열을 지정하는 데 사용할 수 있습니다. 세 개의 속성 중 하나라도 다른 WorkflowIdentity와 다르면 WorkflowIdentity가 고유한 것으로 간주됩니다.

Important

WorkflowIdentity에는 어떠한 PII(개인적으로 식별할 수 있는 정보)도 포함해서는 안 됩니다. 인스턴스를 만드는 데 사용되는 WorkflowIdentity에 대한 정보는 활동 수명 주기의 여러 시점에 런타임에 의해 구성된 추적 서비스로 내보내집니다. WF 추적 기능에는 중요한 사용자 데이터인 PII를 숨기는 메커니즘이 없습니다. 따라서 WorkflowIdentity 인스턴스는 런타임에 의해 추적 레코드에 내보내져 추적 레코드를 볼 수 있는 권한이 있는 사람에게 표시될 수 있기 때문에 이 인스턴스에 PII 데이터가 포함되어서는 안 됩니다.

다음 예제에서는 WorkflowIdentity를 만든 후 MortgageWorkflow 워크플로 정의를 사용하여 만든 워크플로 인스턴스에 연결합니다.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

워크플로를 다시 로드하고 다시 시작할 때는 지속형 워크플로 인스턴스의 WorkflowIdentity와 일치하도록 구성된 WorkflowIdentity를 사용해야 합니다.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

워크플로 인스턴스를 다시 로드할 때 사용된 WorkflowIdentity가 유지된 WorkflowIdentity와 일치하지 않으면 VersionMismatchException이 throw됩니다. 다음 예제에서는 이전 예제에서 유지된 MortgageWorkflow 인스턴스에 대해 로드를 시도합니다. 이 로드를 시도하는 데는 지속형 인스턴스와 일치하지 않는 융자 워크플로의 새로운 버전에 맞게 구성된 WorkflowIdentity가 사용됩니다.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

앞의 코드가 실행되면 다음 VersionMismatchException이 throw됩니다.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

WorkflowIdentity를 사용한 side-by-side 실행

WorkflowIdentity를 사용하면 여러 버전의 워크플로를 손쉽게 side-by-side로 실행할 수 있습니다. 한 가지 일반적인 시나리오는 장기 실행 워크플로에 대한 비즈니스 요구 사항을 변경하는 것입니다. 업데이트된 버전이 배포될 때 여러 워크플로 인스턴스가 실행 중일 수 있습니다. 새 인스턴스를 시작할 때 업데이트된 워크플로 정의를 사용하도록 호스트 애플리케이션을 구성할 수 있으며, 호스트 애플리케이션에서는 인스턴스를 다시 시작할 때 올바른 워크플로 정의를 제공해야 합니다. WorkflowIdentity를 사용하면 워크플로 인스턴스를 다시 시작할 때 일치하는 워크플로 정의를 식별하고 제공할 수 있습니다.

지속형 워크플로 인스턴스의 WorkflowIdentity를 검색하려면 GetInstance 메서드를 사용합니다. GetInstance 메서드는 지속형 워크플로 인스턴스의 Id와 지속형 인스턴스가 포함된 SqlWorkflowInstanceStore를 매개 변수로 받아 WorkflowApplicationInstance를 반환합니다. WorkflowApplicationInstance에는 지속형 워크플로 인스턴스에 연결된 WorkflowIdentity를 포함하여 지속형 워크플로 인스턴스에 대한 정보가 들어 있습니다. 이 연결된 WorkflowIdentity는 호스트에서 워크플로 인스턴스를 로드하고 다시 시작할 때 올바른 워크플로 정의를 제공하는 데 사용될 수 있습니다.

참고 항목

WorkflowIdentity는 null일 수 있으며, 이 값은 호스트에서 적절한 워크플로 정의에 WorkflowIdentity가 연결되지 않은 상태에서 유지된 인스턴스를 매핑하는 데 사용될 수 있습니다. 이는 워크플로 애플리케이션이 원래 워크플로 버전 관리를 사용하여 작성되지 않은 경우나 애플리케이션이 .NET Framework 4에서 업그레이드된 경우에 해당될 수 있습니다. 자세한 내용은 워크플로 버전 관리를 지원하도록 .NET Framework 4 지속성 데이터베이스 업그레이드를 참조하세요.

다음 예제에서는 Dictionary<WorkflowIdentity, Activity>를 사용하여 WorkflowIdentity 인스턴스를 일치하는 워크플로 정의에 연결하고, identityV1WorkflowIdentity에 연결된 MortgageWorkflow 워크플로 정의를 사용하여 워크플로를 시작합니다.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

다음 예제에서는 GetInstance를 호출하여 이전 예제의 지속형 워크플로 인스턴스에 대한 정보를 검색하고, 유지된 WorkflowIdentity 정보를 사용하여 일치하는 워크플로 정의를 검색합니다. 이 정보는 WorkflowApplication을 구성하는 데 사용되며, 그런 다음 워크플로가 로드됩니다. Load를 사용하는 WorkflowApplicationInstance 오버로드가 사용되므로 SqlWorkflowInstanceStore에서 구성된 WorkflowApplicationInstanceWorkflowApplication에서 사용되며, 따라서 InstanceStore 속성을 구성할 필요가 없습니다.

참고 항목

InstanceStore 속성을 설정할 경우에는 SqlWorkflowInstanceStore에 사용된 WorkflowApplicationInstance 인스턴스와 동일하게 설정해야 하며, 그렇지 않으면 ArgumentException이라는 메시지와 함께 The instance is configured with a different InstanceStore than this WorkflowApplication.이 throw됩니다.

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

워크플로 버전 관리를 지원하기 위해 .NET Framework 4 지속성 데이터베이스 업그레이드

.NET Framework 4 데이터베이스 스크립트를 사용하여 만들어진 지속성 데이터베이스를 업그레이드하기 위해 SqlWorkflowInstanceStoreSchemaUpgrade.sql 데이터베이스 스크립트가 제공됩니다. 이 스크립트는 .NET Framework 4.5에 도입된 새 버전 관리 기능을 지원하도록 데이터베이스를 업데이트합니다. 데이터베이스의 지속형 워크플로 인스턴스는 기본 버전 관리 값이 제공 받으며, side-by-side 실행 및 동적 업데이트에 참여할 수 있습니다.

.NET Framework 4.5 워크플로 애플리케이션이 제공된 스크립트를 사용하여 업그레이드되지 않은 지속성 데이터베이스에서 새 버전 관리 기능을 사용하는 지속성 작업을 시도하면 다음 메시지와 함께 InstancePersistenceCommandException이 throw됩니다.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

데이터베이스 스키마를 업그레이드하려면

  1. SQL Server Management Studio를 열고 지속성 데이터베이스 서버(예: .\SQLEXPRESS)에 연결합니다.

  2. 파일 메뉴에서 열기, 파일을 차례로 선택합니다. C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en 폴더로 이동합니다.

  3. SqlWorkflowInstanceStoreSchemaUpgrade.sql을 선택하고 열기를 클릭합니다.

  4. 사용 가능한 데이터베이스 드롭다운에서 지속성 데이터베이스의 이름을 선택합니다.

  5. 쿼리 메뉴에서 실행을 선택합니다.

쿼리가 완료되면 데이터베이스 스키마가 업그레이드되고 지속형 워크플로 인스턴스에 할당된 기본 워크플로 ID를 볼 수 있습니다. 개체 탐색기데이터베이스 노드에서 지속성 데이터베이스를 확장하고 노드를 확장합니다. System.Activities.DurableInstancing.Instances를 마우스 오른쪽 단추로 클릭하고 상위 1000개의 행 선택을 선택합니다. 열의 끝까지 스크롤하고 뷰에 여섯 개의 추가 열(IdentityName, IdentityPackage, Build, Major, MinorRevision)이 추가되었는지 확인합니다. 지속형 워크플로의 경우 이러한 필드의 값은 NULL입니다. 이 값은 워크플로 ID가 null임을 나타냅니다.