다음을 통해 공유


SqlTrackingService 사용

SqlTrackingService 클래스는 제대로 작동하는 추적 서비스를 나타냅니다. 이 서비스를 사용하여 추적 정보를 수집 및 저장하고 추적 프로필을 저장하여 워크플로 런타임 엔진이 요청할 때 제공할 수 있습니다. SQL 추적 서비스는 런타임 추적 인프라가 보낸 추적 데이터를 SQL 데이터베이스에 씁니다.

많은 시나리오에서 SqlTrackingService 서비스가 데이터베이스와 워크플로 런타임 엔진의 상태 간에 일관성을 유지 관리하는 것이 중요합니다. 따라서 SqlTrackingService 클래스는 IPendingWork 인터페이스를 구현하며, WorkflowCommitWorkBatchService 서비스에서 제공하는 워크플로 트랜잭션 일괄 처리 기능에 참여할 수 있습니다. IsTransactional 속성을 설정하거나 해당 매개 변수를 생성자로 전달하여 SqlTrackingService 서비스가 일괄 처리에 참여하도록 구성하고 보류 중인 SQL 데이터베이스 변경 내용을 나타내는 개체를 작업 일괄 처리에 추가할 수 있습니다.

또한 SqlTrackingService 서비스는 추적 프로필을 데이터베이스에 유지 관리합니다. 워크플로 런타임 엔진은 사용 중인 추적 프로필의 변경 내용에 대해 알고 있습니다. SqlTrackingService 서비스는 데이터베이스에 저장된 TrackingProfile의 변경 내용을 워크플로 런타임 엔진에 알리기 위해 IProfileNotification 인터페이스를 구현하고 데이터베이스의 추적 프로필을 정기적으로 검사합니다. ProfileChangeCheckInterval 속성을 설정하거나 해당 매개 변수를 생성자로 전달하여 SqlTrackingService 서비스가 해당 추적 프로필을 검사하는 간격을 설정할 수 있습니다.

참고

SqlTrackingService는 추적 데이터베이스에 호스트 정보를 저장하지 않습니다. 따라서 다중 호스트 시나리오에서는 이 서비스를 사용하여 호스트 정보를 검색할 수 없습니다. 이렇게 하려면 호스트 GUID나 호스트 이름 등과 같은 관련된 호스트 정보를 모두 저장하는 사용자 지정 추적 서비스를 구현해야 합니다.

참고

워크플로 응용 프로그램에 SqlTrackingServiceSqlWorkflowPersistenceService를 모두 사용하는 경우 단일 데이터베이스를 유지과 추적에 모두 사용하는 것이 좋습니다.

SQL 추적 데이터베이스 만들기

Windows Workflow Foundation 설치 프로그램은 SqlTrackingService 서비스에 필요한 데이터베이스를 설치하지 않지만, 이 서비스에 대한 데이터베이스를 만들고 구성할 수 있는 SQL 스크립트를 설치합니다. 이 단원에서는 SqlTrackingService 서비스에서 사용하는 SQL Server 데이터베이스를 올바르게 구성하는 단계를 설명합니다.

참고

Windows Workflow Foundation에서 설치하는 SQL 서비스는 Microsoft SQL Server를 사용하여 정보를 저장합니다. 이러한 작업에 Microsoft SQL Server 2005 Express, SQL Server 2000 이상 버전 또는 SQL Server 2000 Desktop Engine(MSDE)을 사용할 수 있습니다.

SQL 추적 데이터베이스를 만들려면

  • Microsoft SQL Server 2005 Express, SQL Server 2000 이상 버전 또는 MSDE에서 다음과 같은 SQL 쿼리문을 사용하여 이름이 WorkflowTrackingStore인 새 데이터베이스를 만듭니다.

    CREATE DATABASE WorkflowTrackingStore
    

참고

워크플로 응용 프로그램에 SqlTrackingServiceSqlWorkflowPersistenceService를 모두 사용하는 경우 단일 데이터베이스를 유지과 추적에 모두 사용하는 것이 좋습니다.

  1. SQL 쿼리 분석기 작업 영역의 사용 가능한 데이터베이스 목록에서 1단계에서 만든 데이터베이스를 선택합니다.

  2. 파일 메뉴에서 열기를 클릭한 후 SQL 스크립트 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\SqlTracking_Schema를 엽니다.

  3. 실행을 클릭하거나 F5 키를 눌러 쿼리를 실행하여 SQL 추적 서비스 테이블을 만듭니다.

  4. 파일 메뉴에서 열기를 클릭한 후 SQL 스크립트 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\SqlTracking_Logic을 엽니다.

  5. 실행을 클릭하거나 F5 키를 눌러 쿼리를 실행하여 SQL 추적 서비스 저장 프로시저를 만듭니다.

런타임 엔진에 SqlTrackingService 추가

Windows Workflow Foundation 런타임 엔진에 프로그래밍 방식으로 또는 응용 프로그램 구성 파일을 사용하여 런타임 서비스를 추가할 수 있습니다.

SqlTrackingService의 App.config를 수정하려면

  1. App.config 파일의 Services 요소에 add라는 새 요소를 만듭니다.

  2. System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 값을 가진 add 요소에 type이라는 특성을 추가합니다.

  3. Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI; 값을 가진 add 요소에 connectionString이라는 특성을 추가합니다.

참고

SQL Server의 구성에 따라 연결 문자열을 수정해야 할 수 있습니다. 다음 예제의 연결 문자열에서는 데이터베이스 이름이 WorkflowTrackingStore이고 SQL Server가 응용 프로그램 개발에 사용 중인 시스템에 설치되어 있다고 가정합니다.

  1. <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;"/>

런타임 엔진에 프로그래밍 방식으로 SqlTrackingService 추가

  • WorkflowRuntime 클래스에 정의된 AddService 메서드를 호출하여 SqlTrackingService의 새 인스턴스를 전달합니다.

    다음 예제에서는 이전 절차의 예제와 동일한 구성을 사용하여 SqlTrackingService를 만드는 방법을 보여 줍니다.

    [C#]

    using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        // Create the SqlTrackingService.
        string connectionString ="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;";
        SqlTrackingService trackService = new SqlTrackingService(connectionString);
    
        // Add the SqlTrckingService to the runtime engine
        workflowRuntime.AddService( trackService );
    
        // ...
    }
    

TrackingProfile과 워크플로 유형 연결

런타임 엔진에 SqlTrackingService 서비스를 추가한 후 바로 사용할 수 있습니다. 추적 프로필이 지정되지 않은 경우 UseDefaultProfile 속성이 true이면 SqlTrackingService 서비스는 기본 프로필을 사용합니다. 이 인스턴스에서 기본 프로필을 사용하면 모든 워크플로 및 활동 이벤트에 대해 추적 정보가 저장됩니다. 그러나 추적되는 정보를 제어하려면 SqlTrackingService와 함께 사용할 TrackingProfile을 정의해야 합니다. 그러나 UseDefaultProfile 속성이 false인 경우, 시작되는 워크플로 유형과 연결된 프로필이 없으면 SqlTrackingService에서 기본 추적 프로필을 사용하지 않습니다.

Windows Workflow Foundation에서 제공하는 SQL 저장 프로시저에는 UpdateTrackingProfile이라는 프로시저가 포함되어 있습니다. 이 프로시저를 사용하여 추적할 워크플로의 유형 이름, 워크플로가 정의된 어셈블리, 추적 프로필 버전의 버전 문자열 및 XML로 serialize된 추적 프로필을 전달할 수 있습니다.

다음 예제에서는 TrackingProfile 개체를 프로그래밍 방식으로 만드는 방법을 보여 줍니다. 이 예제에서 만들어지는 TrackingProfile 개체는 워크플로에 정의된 CodeActivity 활동을 추적하는 데만 사용할 수 있습니다.

static void CreateTrackingProfile()
{
    TrackingProfile profile = new TrackingProfile();
    ActivityTrackPoint trackPoint = new ActivityTrackPoint();

    // Track CodeActivity activities only.
    ActivityTrackingLocation location = new ActivityTrackingLocation
        (typeof(System.Workflow.Activities.CodeActivity));

    // Add all activity tracking events.
    foreach (ActivityExecutionStatus s in 
        Enum.GetValues(typeof(ActivityExecutionStatus)))
    {
        location.ExecutionStatusEvents.Add(s);
    }

    trackPoint.MatchingLocations.Add(location);
    profile.ActivityTrackPoints.Add(trackPoint);
    profile.Version = new Version("1.0.0.0");

    WorkflowTrackPoint wtp = new WorkflowTrackPoint();
    WorkflowTrackingLocation wtl = new WorkflowTrackingLocation();

    // Add all workflow tracking events.
    foreach (TrackingWorkflowEvent s in 
        Enum.GetValues(typeof(TrackingWorkflowEvent)))
    {
        wtl.Events.Add(s);
    }

    wtp.MatchingLocation = wtl;
    profile.WorkflowTrackPoints.Add(wtp);

    // Serialize tracking profile and save to SQL.
    TrackingProfileSerializer serializer = new TrackingProfileSerializer();
    StringWriter writer = new StringWriter(new StringBuilder(), 
        CultureInfo.InvariantCulture);
    serializer.Serialize(writer, profile);
    InsertTrackingProfile(writer.ToString());
}

다음 코드 예제의 마지막 줄에서 InsertTrackingProfile라는 메서드가 호출됩니다. 다음 예제에 정의된 이 메서드는 UpdateTrackingProfile 저장 프로시저를 사용하여 추적 데이터베이스를 새 TrackingProfile로 업데이트합니다.

static void InsertTrackingProfile(string profile)
{
    SqlCommand cmd = new SqlCommand();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbo.UpdateTrackingProfile";
    cmd.Connection = new SqlConnection(Program.connectionString);
    try
    {
        cmd.Parameters.Clear();

        SqlParameter typFullName = new SqlParameter();
        typFullName.ParameterName = "@TypeFullName";
        typFullName.SqlDbType = SqlDbType.NVarChar;
        typFullName.SqlValue = typeof(SimpleWorkflow).ToString();
        cmd.Parameters.Add(typFullName);

        SqlParameter assemblyFullName = new SqlParameter();
        assemblyFullName.ParameterName = "@AssemblyFullName";
        assemblyFullName.SqlDbType = SqlDbType.NVarChar;
        assemblyFullName.SqlValue = typeof(SimpleWorkflow).Assembly.FullName;
        cmd.Parameters.Add(assemblyFullName);

        SqlParameter versionId = new SqlParameter();
        versionId.ParameterName = "@Version";
        versionId.SqlDbType = SqlDbType.VarChar;

        // The version ID must match the tracking profile version 
        // number.
        versionId.SqlValue = "1.0.0.0";

        cmd.Parameters.Add(versionId);

        SqlParameter trackingProfile = new SqlParameter();
        trackingProfile.ParameterName = "@TrackingProfileXml";
        trackingProfile.SqlDbType = SqlDbType.NVarChar;
        trackingProfile.SqlValue = profile;
        cmd.Parameters.Add(trackingProfile);

        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
    catch (SqlException e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine("The Tracking Profile was not inserted. " + 
            "if you want to add a new Tracking Profile, modify the version " + 
            "string in the profile by specifying a higher version number.");
        return;
    }
    finally
    {
        if ((null != cmd) && (null != cmd.Connection) && 
            (ConnectionState.Closed != cmd.Connection.State))
            cmd.Connection.Close();
    }
}

추적되는 워크플로 유형을 만들고 시작하기 전에 여기에 표시된 TrackingProfile 정의 프로세스를 호출해야 합니다. 워크플로가 시작되면 SqlTrackingServiceTrackingProfile을 사용해야 함을 감지하고 그에 따라 추적 정보를 처리합니다.

참고

추적 프로필과 연결된 워크플로 유형이 변경될 경우 추적 프로필의 버전 번호를 업데이트해야 합니다. 그렇지 않으면 추적 서비스에서 추적 데이터를 이전의 워크플로 유형과 연결할 수 없습니다.

추적 데이터베이스에서 추적 정보를 추출하는 방법에 대한 자세한 내용은 SqlTrackingQuery로 SqlTrackingService 데이터 쿼리를 참조하십시오. SqlTrackingService 데이터베이스에서 추적 데이터를 체계적으로 구성하도록 설계된 Windows Workflow Foundation의 데이터 유지 관리 기능에 대한 자세한 내용은 SqlTrackingService로 데이터 유지 관리를 참조하십시오.

참고 항목

참조

SqlTrackingService
TrackingProfile

개념

SqlTrackingQuery로 SqlTrackingService 데이터 쿼리
SqlTrackingService로 데이터 유지 관리
Windows Workflow 추적 서비스

기타 리소스

Simple Tracking Sample
Tracking Using User Track Points Sample
Using the Tracking Profile Object Model Sample
Workflow Tracking Service Database Schema

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.