작업 4: Windows Workflow 추적 서비스 사용
이전 작업에서는 워크플로가 유휴 상태가 될 때 워크플로를 유지하기 위해 SqlWorkflowPersistenceService 서비스를 사용했습니다.
이 작업에서는 SqlTrackingService 서비스를 사용하여 워크플로를 실행할 때 발생하는 워크플로 인스턴스 및 활동 이벤트를 추적합니다. SqlTrackingService 서비스는 SqlTrackingQuery 클래스를 사용하기 위해 WorkflowRuntime에 정의된 AddService 메서드를 사용하여 추가됩니다.
워크플로의 실행이 완료된 후 SqlTrackingQuery 클래스를 사용하여 추적 데이터베이스에서 추적 정보를 추출할 수 있습니다. SqlTrackingQuery 클래스의 인스턴스를 만들어 사용 중인 추적 데이터베이스에 대한 연결 문자열을 전달하면 SqlTrackingWorkflowInstance 개체의 ActivityEvents 속성에 액세스하여 각 추적 레코드를 열거할 수 있습니다. 여기에는 워크플로의 활동에 대한 추적 정보를 볼 수 있는 ActivityTrackingRecord 개체의 컬렉션이 포함됩니다. 또한 동일한 절차를 통해 SqlTrackingWorkflowInstance 클래스에 정의된 WorkflowEvents 속성에 액세스하여 워크플로 인스턴스 이벤트를 추적할 수 있습니다.
참고
Windows Workflow Foundation으로 설치되는 SQL 서비스는 Microsoft SQL Server를 사용하여 정보를 저장합니다. 이러한 작업에 Microsoft SQL Server 2005 Express, Microsoft SQL Server 2000 이상 버전 또는 Microsoft SQL Server 2000 Desktop Engine(MSDE)을 사용할 수 있습니다.
참고
Windows Workflow Foundation 설치 프로그램은 이러한 서비스에 필요한 데이터베이스를 설치하지 않지만, 이러한 서비스에 대한 데이터베이스를 만들고 구성하기 위한 SQL 스크립트를 설치합니다.
참고
이 연습을 차례대로 수행하는 것이 좋지만 반드시 그럴 필요는 없습니다. 샘플 프로젝트를 열고 다음 단원의 단계를 진행하여 이 연습을 시작할 수 있습니다. 또한 프로젝트가 제대로 작동하려면 응용 프로그램에서 사용하는 유지 데이터베이스를 만들어야 합니다. 이렇게 하려면 작업 3: Windows Workflow 유지 서비스 사용의 "SQL 유지 데이터베이스 만들기" 절차를 따르십시오.
SQL 추적 데이터베이스를 만들려면
Microsoft SQL Server 2005 Express, Microsoft SQL Server 2000 이상 버전 또는 Microsoft SQL Server 2000 Desktop Engine(MSDE)에서 다음과 같은 SQL 쿼리문을 사용하여 WorkflowTrackingStore라는 새 데이터베이스를 만듭니다.
CREATE DATABASE WorkflowTrackingStore
SQL 쿼리 분석기 작업 영역의 사용 가능한 데이터베이스 목록에서 1단계에서 만든 데이터베이스를 선택합니다.
파일 메뉴에서 열기를 클릭한 다음 SQL 스크립트 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\Tracking_Schema.sql을 엽니다.
실행을 클릭하거나 F5 키를 눌러 쿼리를 실행하여 SQL 추적 서비스 테이블을 만듭니다.
파일 메뉴에서 열기를 클릭한 다음 SQL 스크립트 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\Tracking_Logic.sql을 엽니다.
실행을 클릭하거나 F5 키를 눌러 쿼리를 실행하여 SQL 추적 서비스 저장 프로시저를 만듭니다.
SQL 네임스페이스를 가져오려면
다음 지시문을 Program 클래스가 포함된 파일에 추가하여 SqlTrackingQuery 클래스와 추적을 사용하는 데 필요한 형식을 가져옵니다.
using System.Workflow.Runtime.Tracking; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes;
SqlTrackingService의 App.config를 수정하려면
App.config 파일의 Services 요소에서 add라는 새 요소를 만듭니다.
add 요소에서 System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 값을 가진 type이라는 특성을 추가합니다.
add 요소에서 Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI; 값을 가진 connectionString이라는 특성을 추가합니다.
<add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>
워크플로 이벤트를 추적하려면
프로젝트의 Program 클래스에서 connectionString이라는 String 형식의 새 static 필드를 만듭니다.
이 필드에 "Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;" 값을 지정합니다.
public static string connectionString = "Initial Catalog=WorkflowTrackingStore;" + "Data Source=localhost;Integrated Security=SSPI;";
프로젝트의 Program 클래스에서 instanceId라는 Guid 매개 변수를 받아들이는 GetInstanceTrackingEvents라는 새 static 메서드를 만듭니다.
GetInstanceTrackingEvents 메서드에서 새 SqlTrackingQuery 개체를 만들어 connectionString 변수를 매개 변수로 생성자에 전달합니다.
sqlTrackingWorkflowInstance라는 SqlTrackingWorkflowInstance 변수를 만들고 해당 개체를 instanceId 매개 변수와 함께 SqlTrackingQuery 개체에 정의된 TryGetWorkflow 메서드에 전달합니다. TryGetWorkflow 메서드는 성공 또는 실패를 나타내는 부울 값을 반환합니다. 메서드가 false를 반환하는 경우 오류 메시지를 출력하고 메서드에서 돌아옵니다.
sqlTrackingWorkflowInstance 개체에 정의된 WorkflowEvents 컬렉션에 포함된 각 WorkflowTrackingRecord를 열거합니다.
WriteLine 메서드를 사용하여 TrackingWorkflowEvent 및 EventDateTime 속성을 표시합니다. GetInstanceTrackingEvents는 다음과 유사합니다.
static void GetInstanceTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; if (!sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance)) { Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance"); } else { Console.WriteLine("\nInstance Level Events:\n"); foreach (WorkflowTrackingRecord workflowTrackingRecord in sqlTrackingWorkflowInstance.WorkflowEvents) { Console.WriteLine("EventDescription : {0} DateTime : {1}", workflowTrackingRecord.TrackingWorkflowEvent, workflowTrackingRecord.EventDateTime); } } }
Private Shared Sub GetInstanceTrackingEvents(ByVal instanceId As Guid) Dim sqlTrackingQuery As SqlTrackingQuery = _ New SqlTrackingQuery(connectionString) Dim sqlTrackingWorkflowInstance As SqlTrackingWorkflowInstance = Nothing If sqlTrackingQuery.TryGetWorkflow(instanceId, sqlTrackingWorkflowInstance) = False Then Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance") Else Console.WriteLine(Constants.vbLf & "Instance Level Events:" & Constants.vbLf) For Each workflowTrackingRecord As WorkflowTrackingRecord In _ sqlTrackingWorkflowInstance.WorkflowEvents Console.WriteLine("EventDescription : {0} DateTime : {1}", _ workflowTrackingRecord.TrackingWorkflowEvent, _ workflowTrackingRecord.EventDateTime) Next workflowTrackingRecord End If End Sub
Program 클래스의 Main 메서드에서 StopRuntime 메서드 호출 후에 방금 만든 GetInstanceTrackingEvents 메서드를 호출하여 workflowInstance 개체의 InstanceId 속성을 매개 변수로 전달합니다.
GetInstanceTrackingEvents(workflowInstance.InstanceId);
활동 이벤트를 추적하려면
프로젝트의 Program 클래스에서 instanceId라는 Guid 매개 변수를 받아들이는 GetActivityTrackingEvents라는 새 static 메서드를 만듭니다.
GetActivityTrackingEvents 메서드에서 새 SqlTrackingQuery 개체를 만들어 connectionString 변수를 매개 변수로 생성자에 전달합니다.
sqlTrackingWorkflowInstance라는 SqlTrackingWorkflowInstance 변수를 만들고 해당 개체를 instanceId 매개 변수와 함께 SqlTrackingQuery 개체에 정의된 TryGetWorkflow 메서드에 전달합니다. TryGetWorkflow 메서드는 성공 또는 실패를 나타내는 부울 값을 반환합니다. 메서드가 false를 반환하는 경우 오류 메시지를 출력하고 메서드에서 돌아옵니다.
sqlTrackingWorkflowInstance 개체에 정의된 ActivityEvents 컬렉션에 포함된 각 ActivityTrackingRecord를 열거합니다.
WriteLine 메서드를 사용하여 activityTrackingRecord 개체의 ExecutionStatus, EventDateTime 및 QualifiedName 속성을 표시합니다. GetActivityTrackingEvents 메서드는 다음과 유사합니다.
static void GetActivityTrackingEvents(Guid instanceId) { SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString); SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance; if (!sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance)) { Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance"); } else { Console.WriteLine("\nActivity Tracking Events:\n"); foreach (ActivityTrackingRecord activityTrackingRecord in sqlTrackingWorkflowInstance.ActivityEvents) { Console.WriteLine( "StatusDescription: {0} DateTime: {1} Activity Qualified ID: {2}", activityTrackingRecord.ExecutionStatus, activityTrackingRecord.EventDateTime, activityTrackingRecord.QualifiedName); } } }
Private Shared Sub GetActivityTrackingEvents(ByVal instanceId As Guid) Dim sqlTrackingQuery As SqlTrackingQuery = _ New SqlTrackingQuery(connectionString) Dim sqlTrackingWorkflowInstance As SqlTrackingWorkflowInstance = Nothing If sqlTrackingQuery.TryGetWorkflow(instanceId, sqlTrackingWorkflowInstance) = False Then Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance") Else Console.WriteLine(Constants.vbLf & "Activity Tracking Events:" & _ Constants.vbLf) For Each activityTrackingRecord As ActivityTrackingRecord In _ sqlTrackingWorkflowInstance.ActivityEvents Console.WriteLine( _ "StatusDescription: {0} DateTime: {1} Activity Qualified ID: {2}", _ activityTrackingRecord.ExecutionStatus, _ activityTrackingRecord.EventDateTime, _ activityTrackingRecord.QualifiedName) Next activityTrackingRecord End If End Sub
Program 클래스의 Main 메서드에서 StopRuntime 메서드 호출 후에 방금 만든 GetActivityTrackingEvents 메서드를 호출하여 workflowInstance 개체의 InstanceId 속성을 매개 변수로 전달합니다.
GetActivityTrackingEvents(workflowInstance.InstanceId);
프로젝트를 빌드하고 응용 프로그램을 실행합니다.
출력은 다음 그림과 유사하게 나타납니다.
코드 컴파일
코드 컴파일에 대한 자세한 내용은 코드 컴파일을 참조하십시오.
작업 5: 추적 프로필 만들기에서는 CodeActivity 활동에 대한 모든 워크플로 이벤트와 활동 이벤트를 추적하는 사용자 지정 추적 프로필을 만듭니다.
참고 항목
작업
참조
SqlTrackingService
SqlTrackingQuery
SqlTrackingWorkflowInstance
ActivityEvents
ActivityTrackingRecord
WorkflowEvents
WorkflowTrackingRecord
ExecutionStatus
개념
Copyright © 2007 by Microsoft Corporation. All rights reserved.