Windows Workflow Foundation의 추적 서비스

Windows Workflow Foundation의 추적 서비스
Matt Milner

코드 다운로드 위치: Foundations2007_03.exe (178 KB) 
Browse the Code Online
Windows Workflow Foundation의 가장 강력한 기능 중 하나는 추적 기능입니다. 이 기능을 사용하여 워크플로에서 이벤트, 작업 속성 및 사용자 지정 데이터를 모니터링할 수 있습니다. 이 칼럼에서는 추적 인프라에 대해 살펴보고, 기본 제공 SQL Server™ 기반 추적 서비스의 사용 방법과 다양한 용도의 사용자 지정 추적 서비스를 만드는 방법에 대해 알아보도록 하겠습니다. 또한 추적 중인 정보를 사용하는 방법과 추적 기능을 사용하여 응용 프로그램의 몇몇 일반적인 요구 사항을 해결하는 방법도 살펴볼 것입니다.
많은 응용 프로그램에서는 프로그램 논리의 실행과 프로세싱 단계를 파악해야 하는데, 이는 규정을 준수하거나, 중요 실행 시점을 기준으로 작업 목록을 관리하거나, 기타 다양한 요구 사항을 충족하기 위해서입니다. Windows® Workflow Foundation은 각 응용 프로그램마다 다른 추적 시스템을 만드는 대신 사용자 지정 구현을 오버레이할 수 있는 유연한 인프라를 제공하므로 개발 모델이 간소화되어 개발자가 추적에 대한 비즈니스 요구 사항에 집중할 수 있습니다.

추적 아키텍처
Windows Workflow Foundation에서 워크플로를 호스팅할 때는 워크플로 런타임과 런타임 서비스 집합을 모두 호스팅합니다. 지속성 서비스와 같은 많은 런타임 서비스를 사용하려면 런타임에 단일 인스턴스가 등록되어 있어야 합니다. 그러나 추적 서비스는 예외로, 다양한 비즈니스 요구 사항을 지원하기 위해 런타임에 여러 추적 서비스를 추가할 수 있습니다. 이렇게 하면 특정 구현을 담당하는 서로 다른 각각의 추적 서비스를 하나의 응용 프로그램에 적용할 수 있습니다.
Windows Workflow Foundation의 추적 기능은 중앙 인터셉터를 기반으로 하며, 작업과 워크플로 이벤트를 모니터링하여 적절한 데이터를 구성된 각 추적 서비스로 보냅니다. 이 아키텍처는 그림 1에 나와 있습니다. 추적 인터셉터가 모든 이벤트에 대한 알림을 수신하지만 대부분의 경우 이러한 이벤트의 일부만이 유용하게 사용됩니다. 게다가 여러 가지 추적 서비스를 사용하는 경우 각 서비스에는 일부 고유한 정보만 필요하게 됩니다. 따라서 추적 인터셉터는 각각의 구성된 추적 서비스를 쿼리하여 각 워크플로 유형에 대한 추적 프로필을 얻습니다.
그림 1 추적 아키텍처 (더 크게 보려면 이미지를 클릭하십시오.)
추적 프로필은 추적 서비스가 수신하려는 이벤트 유형에 대한 정보를 인터셉터에 제공합니다. 이러한 이벤트는 워크플로, 작업 및 사용자의 세 가지 범주로 나눌 수 있습니다.
워크플로 이벤트를 사용하면 워크플로의 다양한 상태와 해당 상태가 발생한 시간을 추적할 수 있습니다. WorkflowTerminated 또는 WorkflowCompleted와 같은 사용자 지정 이벤트 인수를 포함하는 이벤트의 경우 이벤트 인수 자체를 추적할 수 있으며 나중에 쿼리할 수도 있습니다.
작업 이벤트를 사용하면 작업이 특정 상태가 되는 시기와 이 상태가 되었을 때의 특정 속성 값을 추적할 수 있습니다. 예를 들어 전자 메일을 보내는 작업이 있을 경우 이 작업이 Closed 상태가 될 때 To 주소 속성을 추적할 수 있습니다.
마지막으로 사용자 이벤트는 워크플로 또는 작업의 코드에서 수동으로 데이터를 추적할 수 있게 해줍니다.

추적 프로필
각 추적 서비스는 추적 인터셉터에 추적 프로필을 제공해야 합니다. 서비스는 모든 워크플로에 대해 같은 프로필을 제공하거나 각각의 워크플로 유형에 대해 서로 다른 프로필을 제공할 수 있습니다. 프로필을 관리하고 생성하는 방법은 서비스 작성자가 결정합니다.
추적 프로필은 System.Workflow.Runtime.Tracking 네임스페이스에서 개체 모델을 사용하여 만들거나 XML로 직접 만들 수 있습니다. 추적 프로필은 일반적으로 개체 모델을 사용하여 만들지만 이것이 프로필을 만드는 유일한 방법이나 최적의 방법은 아닙니다. 이런 이유로 추적 프로필을 XML로 serialize하거나 XML에서 deserialize할 수 있습니다. TrackingProfileSerializer 클래스를 사용하여 TrackingProfile 개체를 XML 텍스트로 변환하고 그 반대로 변환할 수도 있습니다. 이에 대한 유용한 예와 기본 추적 프로필 편집 도구로 Windows SDK의 Tracking Profile Designer 샘플을 들 수 있습니다. 이 응용 프로그램을 사용하면 워크플로 디자인 화면을 통해 추적 프로필을 시각적으로 정의할 수 있습니다. 이 도구에는 사용자 추적점에 대한 지원 부족 등과 같은 일부 제한 사항이 있지만 이 도구를 사용하면 추적 프로필을 serialize된 형식으로 볼 수 있습니다. 또한 많은 상황에서 추적 프로필 개발 및 배포 속도를 높일 수 있습니다.
추적 프로필은 근본적으로 추적점의 컬렉션입니다. 각 추적점은 추적할 수 있는 이벤트 유형과 상관 관계가 있으며, 데이터 추출 시기 및 추출할 데이터에 대한 정보를 런타임에 제공합니다. 예를 들어 워크플로 이벤트를 추적하도록 지정하려면 WorkflowTrackPoint를 추적 프로필에 추가해야 합니다. 추적점에는 실제로 데이터를 추적할 위치와 시기를 정의하는 하나 이상의 추적 위치가 포함됩니다. 예를 들어 WorkflowTrackPoint에서 MatchingLocation 속성은 추적할 다양한 워크플로 이벤트를 식별합니다. 그림 2에 추적 프로필을 생성하는 코드가 나와 있습니다. 여기에는 하나의 WorkflowTrackPoint가 있으며, 해당 서비스가 워크플로의 예외, 종료, 중단 등의 오류 조건을 추적하도록 지정합니다.
//create the profile object and set the versionTrackingProfile profile = new TrackingProfile();profile.Version = new Version(1, 0, 0);//define a tracking pointWorkflowTrackPoint wfTrack = new WorkflowTrackPoint();//create a list of events we are interested inList<TrackingWorkflowEvent> events = new List<TrackingWorkflowEvent>();events.Add(TrackingWorkflowEvent.Aborted);events.Add(TrackingWorkflowEvent.Terminated);events.Add(TrackingWorkflowEvent.Exception);//create a tracking location to indicate which events should be trackedWorkflowTrackingLocation wfLocation =     new WorkflowTrackingLocation(events);//set the matching location on the track pointwfTrack.MatchingLocation = wfLocation;//add the track point to the profileprofile.WorkflowTrackPoints.Add(wfTrack);
ActivityTrackPoint는 훨씬 다양한 추적 기능을 지원하는데, 이것은 작업이 워크플로의 핵심을 구성한다는 점을 생각해 보면 당연합니다. ActivityTrackPoint에는 MatchingLocations와 ExcludedLocations 컬렉션이 모두 포함되며, 데이터가 수집되는 시기를 좀 더 정확하게 제어할 수 있습니다. 두 컬렉션 모두에 대해 일치시킬 조건 집합을 나타내는 ActivityTrackingLocation을 정의할 수 있습니다.
ActivityTrackingLocation 클래스를 사용하면 해당 유형을 기반으로 추적할 작업을 정의할 수 있습니다. 또한 파생된 작업을 일치시킬 것인지 지정할 수 있습니다. 예를 들어 모든 작업을 일치시키려면 System.ComponentModel.Activity 형식을 사용하고 MatchDerivedTypes를 true로 설정합니다. 이렇게 하면 기본 작업 클래스와 여기서 파생된 모든 작업을 일치시키므로 결과적으로 모든 것을 일치시키게 됩니다. 그 다음 이 정보를 ActivityTrackPoint의 MatchingLocations 컬렉션에 추가하여 이러한 이벤트를 추적하도록 지정하거나 ExcludedLocations 컬렉션에 추가하여 이 데이터를 수집하지 않도록 지정합니다.
보다 정확한 제어를 위해, 데이터를 추적할 때 충족되어야 하는 조건을 속성과 동등한 형식으로 지정할 수 있습니다. 예를 들어 SendEmail 작업의 우선 순위 속성이 High로 설정될 때에만 전자 메일 메시지를 추적하도록 할 수 있습니다. 그림 3에 이에 대한 예가 나와 있습니다.
ActivityTrackPoint actTrack = new ActivityTrackPoint();ActivityTrackingLocation actMatch = new ActivityTrackingLocation(    typeof(SendEmail), false, new ActivityExecutionStatus[] {         ActivityExecutionStatus.Closed });ActivityTrackingCondition condition =     new ActivityTrackingCondition("Priority", "High");actMatch.Conditions.Add(condition);actTrack.MatchingLocations.Add(actMatch);profile.ActivityTrackPoints.Add(actTrack);
또한 작업 또는 워크플로에서 속성 값 형식으로 데이터를 추출할 수도 있습니다. 예를 들어 워크플로에서 일치하는 위치에 도달하면 SendEmail 작업의 To 및 Subject 속성을 추적할 수 있는데, 이 작업은 ActivityDataTrackingExtract 또는 WorkflowDataTrackingExtract 항목을 ActivityTrackPoint의 Extracts 컬렉션에 추가하여 수행할 수 있습니다. 각 ActivityDataTrackingExtract는 추출하여 추적 서비스로 보낼 구성원을 식별합니다. 추출된 데이터를 작업 추적점에 추가하면 아래와 같이 To 및 Subject 속성을 추적할 수 있습니다.
actTrack.Extracts.Add(new ActivityDataTrackingExtract("To"));actTrack.Extracts.Add(new ActivityDataTrackingExtract("Subject"));
최종 추적점을 식별하는 UserTrackPoints가 세 가지 유형 중에서 가장 유연하게 사용됩니다. 워크플로에서 데이터를 추적해야 하지만 해당 데이터를 작업에서 속성으로 사용할 수 없는 경우가 있습니다. 또는 ActivityTrackingLocation에서 간단한 조건 지원 이상의 논리를 사용해야 할 수 있습니다. 이러한 경우 ActivityExecutionContext의 TrackData 메서드 또는 Activity 클래스를 호출할 수 있습니다. 이를 통해 해당 데이터를 데이터 항목에 대한 옵션 키 또는 이름과 함께 추적 인터셉터로 보낼 수 있습니다. 이 데이터를 수신하는 추적 서비스의 경우 UserTrackPoint를 정확한 일치 위치로 정의해야 합니다. 또한 워크플로와 추출된 작업 데이터를 정의하여 UserTrackPoint가 일치할 때 워크플로의 속성 또는 현재 작업을 추적할 수 있습니다.

SQL 추적 서비스
Windows Workflow Foundation에는 SQL Server 추적 서비스가 포함되어 있으며, 이 서비스를 사용하여 워크플로 유형에 대한 추적 프로필을 정의하여 이를 SQL Server에 배포할 수 있습니다. 그런 다음 추적 서비스가 런타임에 해당 프로필을 사용하여 추적 인터셉터를 구성합니다. SQL Server 추적 서비스에는 프로필 버전 지정, 프로필 업데이트 알림, 데이터 분할 등을 비롯하여 여러 가지 뛰어난 기능이 포함되어 있습니다.
UpdateTrackingProfile 저장 프로시저를 호출하고 워크플로의 유형 정보 및 버전 번호와 함께 serialize된 추적 프로필을 전달하면 SQL 추적 서비스에 추적 프로필이 배포됩니다. 이 저장 프로시저를 사용하여 사용자의 워크플로 유형 전용 추적 프로필을 삽입할 수 있지만 프로필을 업데이트할 때마다 고유한 버전 번호를 사용해야 합니다. 앞에서 설명한 TrackingProfileSerializer를 사용하면 프로필의 XML 텍스트를 가져와 저장 프로시저로 전달할 수 있습니다.
워크플로 유형에 대해 추적 프로필을 지정하지 않으면 SQL 추적 서비스에서 UseDefaultProfile 설정을 사용하여 기본 프로필을 추적 인터셉터에 제공할 것인지를 결정합니다. 기본 프로필은 워크플로에 대한 모든 상태 이벤트와 작업을 추적합니다. 또한 전달된 모든 사용자 추적 이벤트를 추적하기 위한 일치 위치가 포함되어 있습니다. 이러한 기본 동작을 사용하지 않으려면 SQL 추적 서비스를 구성할 때 UseDefaultProfile 속성을 False로 설정해야 합니다. 그러면 프로필에 지정된 워크플로 유형만 추적됩니다.
추적 프로필을 최신으로 유지하기 위해 추적 인터셉터가 이전에 수신했던 프로필을 각 추적 서비스에 주기적으로 요청합니다. 추적 프로필을 반복적으로 로드하거나 만들지 않도록 하기 위해 추적 서비스는 IProfileNotification 인터페이스를 구현할 수 있습니다. 여기에서는 ProfileUpdated와 ProfileRemoved 이벤트를 정의할 수 있는데, 추적 서비스에서 이 인터페이스를 구현하는 경우 추적 인터셉터는 두 이벤트 중 하나가 발생하지 않으면 업데이트된 프로필 정보를 퀴리하지 않습니다. 이 모델을 지원하기 위해 SQL Server 추적 서비스는 데이터베이스를 정기적으로(기본적으로 60초마다) 쿼리하여 워크플로 유형의 추적 프로필이 업데이트 또는 제거되었는지 확인합니다. ProfileChangeCheckInterval 속성을 폴링 간격(밀리초) 값으로 설정하면 서비스가 업데이트를 쿼리하는 간격을 구성할 수 있습니다.
프로덕션 환경에서는 추적 데이터가 빠르게 누적될 수 있기 때문에 SQL 추적 서비스는 데이터 분할 기능을 지원합니다. 데이터를 일, 주, 월 또는 년 단위로 조각화하도록 구성할 수 있으며, 서비스는 각 기간에 대해 추적 테이블을 만듭니다. 또한 작동 중지 시간을 예약할 수 있도록 데이터를 요청 시 이동할 것인지, 워크플로 완료 시 데이터를 자동으로 이동할 것인지를 제어할 수 있습니다. 이 설정을 구성하려면 SQL Server 추적 서비스에서 PartitionOnCompletion 속성을 true로 설정하여 각 워크플로가 완료되면 추적 파티션으로 이동되도록 해야 합니다. 데이터를 수동으로 분할하려면 추적 데이터베이스에서 PartitionCompletedWorkflowInstances 저장 프로시저를 호출합니다.

추적 데이터 쿼리
SQL 추적 서비스를 사용하여 데이터를 수집하는 경우 데이터가 SQL Server에 저장되므로 일반적인 보고 도구를 사용하여 데이터를 검토하고 분석할 수 있습니다. 그러나 어떤 경우에는 워크플로 데이터를 사용자의 응용 프로그램에서 쿼리해야 하는 경우가 있습니다. Windows Workflow Foundation에는 사용자가 SQL 쿼리를 작성하고 데이터베이스에서 정확한 관계를 결정하는 대신 워크플로 인스턴스에 대한 추적 정보를 검색할 수 있는 추적 쿼리 프로그래밍 인터페이스가 포함되어 있습니다. 추적 정보는 클래스로 반환되며 추적 프로필에서 지정한 모든 추적 이벤트 및 데이터에 대한 액세스를 제공합니다.
SqlTrackingQuery 클래스를 사용하면 워크플로의 인스턴스 ID를 사용하여 특정 워크플로 인스턴스의 추적 데이터를 로드하거나 개별 매개 변수 집합을 사용하여 워크플로 목록을 쿼리할 수 있습니다. 특정 인스턴스를 로드하는 경우 TryGetWorkflow 메서드를 사용할 수 있으며, 이 메서드는 요청이 제대로 받아들여졌는지 여부를 부울 값으로 반환합니다. 여러 개의 워크플로의 경우 GetWorkflows 메서드를 사용하여 쿼리할 수 있으며 이 메서드는 SqlTrackingQueryOptions 인스턴스를 필요로 합니다.
쿼리 옵션을 사용하면 추적 데이터베이스에서 워크플로를 검색할 때 사용할 매개 변수를 정의할 수 있습니다. 가장 간단한 옵션으로는 최소 및 최대 날짜 값과 워크플로 유형 및 상태가 있습니다. 예를 들어 완료된 상태이고 오늘과 한 주 전 사이의 워크플로 유형과 일치하는 모든 워크플로를 검색하도록 옵션을 구성할 수 있습니다. 이를 통해 워크플로 유형과 이 유형을 판별할 수 있는 대상 정보를 검색할 수 있습니다.
오류 조건을 추적하는 데 사용할 수 있는 추적 프로필에 대해서는 이미 앞에서 설명했습니다. 그림 4의 코드를 사용하면 종료된 후 예외 세부 사항을 출력하는 모든 워크플로 인스턴스에 대해 데이터베이스를 쿼리할 수 있습니다. 추적된 이벤트가 종료된 경우 추적 정보에는 예외 세부 사항이 이벤트 인수로서 포함됩니다.
SqlTrackingQueryOptions options = new SqlTrackingQueryOptions();options.WorkflowStatus = WorkflowStatus.Terminated;SqlTrackingQuery query = new SqlTrackingQuery(connectionString);IList<SqlTrackingWorkflowInstance> workflows =     query.GetWorkflows(options);foreach (SqlTrackingWorkflowInstance workflow in workflows){    foreach(WorkflowTrackingRecord workflowEvent in         workflow.WorkflowEvents)    {        TrackingWorkflowTerminatedEventArgs args =             workflowEvent.EventArgs as                 TrackingWorkflowTerminatedEventArgs;        if (args != null)        {            Console.WriteLine(                "workflow {0} terminated with exception: {1}",             workflow.WorkflowInstanceId, args.Exception.Message);        }                      }}
추출된 값을 기반으로 검색할 수도 있습니다. 예를 들어 SendEmail 작업에서 받는 사람 주소를 추출하도록 추적 프로필을 구성한 경우 받는 사람 주소가 특정 직원 또는 파트너와 같은 값과 일치했을 때 워크플로 인스턴스를 반환하는 쿼리를 작성할 수 있습니다. 다음 코드는 SqlTrackingQueryOptions에서 TrackingDataItemValue 항목을 사용하여 추출된 값을 기반으로 특정 항목에 대한 검색 조건을 구체화하는 예입니다.
SqlTrackingQueryOptions options = new SqlTrackingQueryOptions();TrackingDataItemValue item = new TrackingDataItemValue(    "sendEmail1", "To", "highpriority@example.com");options.TrackingDataItems.Add(item);SqlTrackingQuery query = new SqlTrackingQuery(connectionString);IList<SqlTrackingWorkflowInstance> workflows =     query.GetWorkflows(options);
보고용으로, 또는 기타 목적으로 SQL Server 데이터베이스를 직접 쿼리하는 경우 테이블을 사용하는 대신 테이블에 정의된 뷰를 사용해야 합니다. 이는 일반적으로 좋은 방법이지만 생성된 모든 추적 파티션의 데이터가 뷰에 포함되므로 여기에서는 매우 중요하게 다루어야 합니다. 뷰를 사용하면 사용자가 직접 이러한 모든 테이블의 데이터를 통합해야 하는 부담이 없어집니다.

사용자 지정 추적 서비스
SQL Server 데이터베이스에서 데이터를 추적하는 것이 가장 일반적이고 중요한 한 가지 용례일 수는 있지만 추적 정보를 사용하는 유일한 시나리오는 아닙니다. Microsoft는 이것이 일반적인 요구 사항이기 때문에 이 서비스를 Windows Workflow Foundation에 포함하기로 결정했습니다. 그러나 이와 같은 서비스를 광범위하게 사용하려면 가능한 한 일반적으로 만들어야 합니다. 즉, 이 서비스가 적합하지 않은 경우가 많을 수 있으며 이러한 경우 사용자 지정 추적 서비스를 만들 수 있습니다.
많은 워크플로 솔루션 요구 사항의 경우 사용자 지정 추적 서비스를 사용하여 해결할 수 있습니다. 여기에서는 사용자가 추적 서비스를 만들기 위한 기본 사항을 설명하고 일반적인 요구 사항을 만족하는 사용자 지정 서비스 예를 몇 가지 보여드리도록 하겠습니다. 중요한 점은 워크플로에 대한 추적이 사용자 관점에서 이루어진다는 점입니다. 사용자가 원하는 결과를 얻을 수 있도록 추적 프로필을 사용하여 추적 서비스를 구성하는 방법을 이해하였으면 이제 사용자 지정 서비스에서 해당 추적 정보를 사용하거나 표시하는 방법이 중요합니다.
사용자 지정 추적 서비스를 만들려면 두 가지를 수행해야 합니다. 우선 사용자 서비스에 대한 추적 프로필을 만드는 방법을 결정해야 합니다. 어떤 경우에는 프로필이 정적이기 때문에 모든 워크플로 유형에 대해 변경되지 않을 수 있습니다. 이런 경우 프로필을 코드로 작성하여 이 프로필이 요청되었을 때 간단히 런타임으로 반환할 수 있습니다. 그러나 추적 서비스에서 여러 프로필 또는 프로필 버전을 지원해야 하는 경우에는 해당 정보를 저장하고 추적 서비스에서 검색하는 방법이 필요합니다.
그런 다음 서비스의 런타임 동작을 제공하는 두 개의 클래스 즉, 추적 서비스와 추적 채널을 구현해야 합니다. 추적 서비스 클래스는 워크플로 런타임 서비스로 작동되며 추적 서비스와 상호 작용하는 호스트 응용 프로그램 및 런타임용 직접 인터페이스입니다. 이 클래스의 인스턴스를 만들고 다른 서비스처럼 코드 또는 구성을 사용하여 워크플로 런타임에 추가하면 됩니다.
추적 서비스 클래스에는 두 가지 기본 기능이 있습니다. 추적 프로필을 추적 인터셉터에 제공하는 기능과 수신기가 데이터를 쓸 수 있는 추적 채널을 제공하는 기능입니다. 추적 채널은 추적 데이터의 수신 및 처리를 담당하도록 구현된 클래스입니다. SQL Server 또는 Windows 이벤트 로그와 같은 저장소에 데이터를 기록하거나, 작업에 대해 WMI(Windows Management Instrumentation) 이벤트 등의 이벤트를 발생시키거나, 데이터를 추적 서비스에 다시 전송하여 메모리에 저장한 후 호스트 응용 프로그램에서 사용하도록 할 수 있습니다. 물론 다른 옵션도 있으며 해당 데이터로 수행할 작업은 사용자의 필요와 요구 사항에 따라 달라집니다. 사용자 지정 추적 서비스는 사용하는 추적 프로필과 수신한 데이터를 처리하는 방법에 따라 구별됩니다.
추적 채널은 두 가지 간단한 메서드인 Send 및 InstanceCompletedOrTerminated를 포함하고 있으므로 아주 쉽게 구현할 수 있습니다. 추적 서비스는 각 워크플로 인스턴스에 대한 추적 채널을 제공하도록 요청받으며 각 요청에 대해 추적 채널의 고유한 인스턴스를 제공하는 것이 일반적입니다. 일반적으로 TrackingParameters를 매개 변수로 사용하는 생성자를 제공해야 하며 다른 메서드 구현 시 이 정보가 필요할 수도 있습니다. TrackingParameters 클래스에는 추적 중인 워크플로 인스턴스에 대한 정보(예: 인스턴스 ID), 루트 작업 정의에 대한 액세스 권한 및 상위 작업과 호출 중인 워크플로(이 워크플로를 다른 워크플로에서 호출한 경우)에 대한 정보가 있습니다.
InstanceCompletedOrTerminated 메서드를 사용하면 워크플로가 완료되었을 때 추적 서비스에 알려주므로 워크플로 추적과 관련된 모든 리소스를 정리할 수 있습니다. InstanceCompletedOrTerminated 메서드에는 매개 변수가 사용되지 않기 때문에 이 부분에서 TrackingParameters에서 제공하는 워크플로 인스턴스 ID에 대한 액세스가 필요합니다.
추적 채널의 Send 메서드는 추적 프로필에서 요청된 모든 추적 레코드에 대해 호출됩니다. 프로필과 비슷하게 기본 클래스인 TrackingRecord에서 모두 파생된 워크플로, 작업 및 사용자 추적 레코드가 있습니다. 사용자는 Send 메서드에서 전송된 추적 레코드 유형을 확인하여 적절히 처리해야 합니다. 추적 프로필에서 사용자 추적 이벤트에 대해 원하는 내용이 없는 경우에는 추적 채널에서 사용자 추적 레코드를 처리할 필요가 없습니다.
추적 서비스 클래스는 자체적으로 추적 프로필을 관리해야 합니다. 추적 서비스 기반 클래스는 워크플로 유형과 워크플로 인스턴스를 기반으로 프로필을 관리할 수 있는 프로필을 검색하는 몇 가지 메서드를 제공합니다. 즉, 서비스는 모든 워크플로에 대해 동일한 프로필부터 각 워크플로 인스턴스에 대해 고유한 프로필까지 반환할 수 있습니다.
GetProfile 메서드에는 두 개의 오버로드가 있으며, 하나는 인스턴스 ID를 포함하고 다른 하나는 유형과 프로필 버전 번호를 포함합니다. 또한 TryGetProfile은 유형 정보를 포함합니다. 이러한 모든 경우에서 사용자 지정 추적 서비스가 해야 하는 작업은 유형 또는 인스턴스에 적절한 추적 프로필을 반환하는 것입니다.
또한 TryReloadProfile이라는 메서드가 있는데 이 메서드는 런타임에 호출되며, 업데이트된 프로필이 있는 경우 이 프로필을 가져옵니다. 프로필을 최신으로 유지해야 하는 경우 추적 인터셉터가 업데이트된 프로필을 추적 서비스에 정기적으로 요청합니다. 이러한 요청이 있을 때마다 새 프로필을 만들거나 조회하는 대신 사용자 지정 추적 서비스에서 IProfileNotification 인터페이스를 구현할 수 있습니다. IProfileNotifcation 인터페이스에는 ProfileRemoved와 ProfileUpdated의 두 가지 이벤트가 있습니다. 추적 서비스에서 이 인터페이스를 구현하면 더 이상 추적 인터셉터가 업데이트를 위해 폴링하지 않습니다. 대신 업데이트가 있는 경우 이 인터페이스의 이벤트를 통해 알려줄 때까지 기다립니다.
이 칼럼의 다운로드 코드에는 샘플 추적 서비스가 여러 개 포함되어 있습니다. 현재 상태 샘플은 추적 기능을 사용하여 상태 시스템 워크플로의 현재 상태를 가져와 호스트 응용 프로그램에서 사용할 수 있도록 합니다. 이 서비스의 추적 프로필에는 State 작업의 실행 상태에 대한 작업 추적점이 포함됩니다. 추적 채널이 작업 추적 레코드를 수신하면 추적 서비스 클래스에서 사전을 현재 상태 이름으로 업데이트합니다. 이는 모든 워크플로에 대해 동일한 프로필을 갖고 호스트 응용 프로그램에서 쿼리할 수 있도록 데이터를 다시 해당 서비스에 기록하는 서비스의 예입니다.
다운로드 코드에 포함된 다른 샘플 추적 서비스는 Windows Workflow Foundation에서 발생하는 일반적인 개발자 문제를 해결하기 위해 개발되었습니다. 워크플로가 호스트에서 실행 및 분리되는 방식 때문에 실행 중인 워크플로에 대한 참조와 정확한 속성 값을 가져오는 프로시저는 그리 간단하지가 않습니다. 이는 일반적인 요구 사항이며 특히 ASP.NET 시나리오의 경우 더 그렇습니다. ManualWorkflowScheduler가 워크플로에서 해당 단계의 실행을 완료한 후 사용자 인터페이스를 워크플로의 속성 값으로 업데이트해야 할 수 있습니다.
CallExternalMethod 작업을 사용하여 워크플로의 정보를 전달할 수 있지만 이 방법이 항상 적합한 것은 아니며 대형 프로젝트의 경우 굉장히 까다로울 수 있습니다. 워크플로 속성 추적 서비스 샘플에서는 추적 기능을 사용하여 이 문제를 해결합니다. 이 추적 서비스에서 반환된 프로필은 워크플로의 다양한 속성을 반영하도록 각 워크플로의 유형마다 다릅니다. Reflection은 추출된 워크플로 추적 데이터 컬렉션을 생성하여 작업 추적점에 추가하는 데 사용됩니다. 추적 위치는 각 작업의 닫힌 이벤트에 있습니다. 따라서 각 작업이 닫힌 후 워크플로 인스턴스의 속성 값이 추출되어 추적 채널로 전송됩니다. 그런 다음 추적 채널이 서비스에서 사전을 업데이트하므로 호스트 응용 프로그램에서 이러한 속성 값을 사용할 수 있습니다.
이들 두 가지는 사용자 추적 서비스의 간단한 예이지만 둘 다 일반적으로 개발자가 겪을 수 있는 상황을 다루며 기존 추적 인프라를 이용하는 재사용 가능한 간단한 구현을 제공합니다. 구축 기반이 없으면 개발자가 겪는 문제는 점점 커지고 더 많은 사용자 지정 코드가 필요해지며 솔루션에 일관성이 없게 됩니다.
여기에서 알 수 있듯이 Windows Workflow Foundation의 추적 서비스는 굉장히 유연하며 서로 다양한 비즈니스 요구 사항을 해결하는 데 도움이 됩니다. 추적 기능은 워크플로 관련 정보를 보여 주는 핵심 기능이며 사용자 지정 추적 서비스는 응용 프로그램에서 이러한 정보를 활용하기 위한 도구입니다.

질문이나 의견이 있으면 다음 전자 메일 주소로 보내시기 바랍니다: mmnet30@microsoft.com.


Matt Milner는 .NET, 웹 서비스, Windows Workflow Foundation, Windows Communication Foundation, BizTalk Server 등의 Microsoft 기술을 전문으로 다루는 독립 소프트웨어 컨설턴트이자 강사이며 아내인 Kristen과 두 아들과 함께 미국 미네소타주에 거주하고 있습니다. 궁금한 점이 있으면 Matt의 블로그(pluralsight.com/blogs/matt)를 방문하십시오.

by 심팍 | 2008/10/21 02:19 | WF | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶