`

WF中的跟踪服务(4):使用跟踪配置文件

阅读更多

概述

默认的Tracking Profile会提取工作流中所有的跟踪信息,我们可以创建自己的跟踪配置文件来筛选跟踪信息。我们接着使用WF中的跟踪服务(3):使用SqlTrackingService跟踪规则中的例子,我们通过自定义tracking profile文件来跟踪RuleSet中变量A B C D的值的变化情况。

每一个TrackingProfile对象包含三个属性(WorkflowTrackPoints,ActivityTrackPoints,UserTrackPoints)表示三种跟踪数据,每一个属性都是相关的(WorkflowTrackPoint,ActivityTrackPoint,UserTrackPoint)的集合。每一个Track Point对象都有一个MatchingLocations属性表示该跟踪点匹配的位置。MatchingLocations相当于你主要的过滤器。例如一个WorkflowTrackPoint,你使用MatchingLocations来标识你要跟踪的位置如Created,Started等等。ActivityTrackPoint和UserTrackPoint除了该属性还有一个ExcludedLocations属性表示排除的位置。ActivityTrackPoint和UserTrackPoint还支持Extracts属性。表示你用来定义你要提取的独立的域或属性,还有一个Annotations属性你可以添加描述信息。WorkflowTrackingLocation获取将为此位置匹配的工作流状态事件的列表,ActivityTrackingLocation,UserTrackingLocation也是一个道理。

我们前面的例子中都是使用默认的Tracking Profile,它以一个XML串的形式存于DefaultTrackingProfile表的TrackingProfileXml字段中。我们自定义Tacking Pofile将生成一个XML串,存入TrackingProfile表的TrackingProfileXml字段中,自定义Tacking Pofile只对指定的工作流有效,默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。如果所有工作流要使用同样的筛选,我们就可以直接修改默认的Tacking Pofile,所有的Tracking profile都包含一个版本Version数字。每一次你修改一个存在的Profile时,你都必须要增加Version数字,工作流引擎一直会使用版本Version数字比较高的Profile。跟踪配置文件在经过序列化后看起来将如下所示:

<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<TrackingProfile xmlns="http://schemas.microsoft.com/winfx/2006/workflow/trackingprofile" 
version="3.0.0.0"> <TrackPoints> <WorkflowTrackPoint> <MatchingLocation> <WorkflowTrackingLocation> <TrackingWorkflowEvents> <TrackingWorkflowEvent>Created</TrackingWorkflowEvent> <TrackingWorkflowEvent>Completed</TrackingWorkflowEvent> <TrackingWorkflowEvent>Idle</TrackingWorkflowEvent> <TrackingWorkflowEvent>Suspended</TrackingWorkflowEvent> <TrackingWorkflowEvent>Resumed</TrackingWorkflowEvent> <TrackingWorkflowEvent>Persisted</TrackingWorkflowEvent> <TrackingWorkflowEvent>Unloaded</TrackingWorkflowEvent> <TrackingWorkflowEvent>Loaded</TrackingWorkflowEvent> <TrackingWorkflowEvent>Exception</TrackingWorkflowEvent> <TrackingWorkflowEvent>Terminated</TrackingWorkflowEvent> <TrackingWorkflowEvent>Aborted</TrackingWorkflowEvent> <TrackingWorkflowEvent>Changed</TrackingWorkflowEvent> <TrackingWorkflowEvent>Started</TrackingWorkflowEvent> </TrackingWorkflowEvents> </WorkflowTrackingLocation> </MatchingLocation> </WorkflowTrackPoint> <ActivityTrackPoint> <MatchingLocations> <ActivityTrackingLocation> <Activity> <Type>System.Workflow.ComponentModel.Activity, System.Workflow.ComponentModel,
Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</Type> <MatchDerivedTypes>true</MatchDerivedTypes> </Activity> <ExecutionStatusEvents> <ExecutionStatus>Initialized</ExecutionStatus> <ExecutionStatus>Executing</ExecutionStatus> <ExecutionStatus>Canceling</ExecutionStatus> <ExecutionStatus>Closed</ExecutionStatus> <ExecutionStatus>Compensating</ExecutionStatus> <ExecutionStatus>Faulting</ExecutionStatus> </ExecutionStatusEvents> </ActivityTrackingLocation> </MatchingLocations> </ActivityTrackPoint> </TrackPoints> </TrackingProfile>

跟踪配置文件是通过使用跟踪配置文件架构创建的。

存储过程

Sql跟踪数据库中有一些存储过程用来管理Tracking profile,有两种方式来使用Tracking Profile。一种可以使用WF提供的对象模型TrackingProfile类,以xml的形式存储在数据库中。另一种可以直接使用XML文件, 但是,必须将以 XML 格式表示的跟踪配置文件反序列化为 TrackingProfile 对象,因为运行时需要 TrackingProfile 对象。下面是相关操作Tracking Profile的存储过程:

1.GetTrackingProfile:得到给定工作流类型的跟踪配置文件。
2.UpdateTrackingProfile:更新给定工作流类型的跟踪配置文件。
3.DeleteTrackingProfile:删除给定工作流类型的跟踪配置文件。该存储过程不会从 SQL 跟踪数据库中移除跟踪配置文件。它只是解除跟踪配置文件与给定工作流类型之间的关联。
4.SetInstanceTrackingProfile:设置给定工作流实例的跟踪配置文件。若要为运行中的工作流实例更新跟踪配置文件,请从要更改跟踪配置文件的 WorkflowInstance 对象中调用 SetInstanceTrackingProfile 存储过程,然后调用ReloadTrackingProfiles 方法。
5.DeleteInstanceTrackingProfile:删除给定工作流实例的跟踪配置文件。DeleteInstanceTrackingProfile 存储过程不会从 SQL 跟踪数据库中删除跟踪配置文件,而只是解除跟踪配置文件与给定工作流实例之间的关联。若要为运行中的工作流实例更新跟踪配置文件,请从要解除与跟踪配置文件关联的 WorkflowInstance 对象中调用 DeleteInstanceTrackingProfile 存储过程,然后调用 ReloadTrackingProfiles 方法。
6.GetCurrentDefaultTrackingProfile:检索 SqlTrackingService 使用的当前默认跟踪配置文件。当 SqlTrackingService 的 UseDefaultProfile 属性设置为“True”,且当工作流类型没有关联的 TrackingProfile 时,使用默认配置文件。7.GetDefaultTrackingProfile:得到默认的跟踪配置文件。
8.UpdateDefaultTrackingProfile:更新 SqlTrackingService 所使用的默认跟踪配置文件。 当 SqlTrackingService 的 UseDefaultProfile 属性设置为 true,并且工作流类型没有关联的 TrackingProfile 时,使用默认配置文件。不能删除默认跟踪配置文件。要停止使用默认配置文件,请将 SqlTrackingService 的 UseDefaultProfile 属性设置为 false。

实现TrackProfileHelper 类

我们来封装一个类来完成对TrackProfile的基本操作,TrackingProfileHelper类。主要使用[GetTrackingProfile],[UpdateTrackingProfile],[DeleteTrackingProfile]存储过程,代码如下:

namespace CarySqlRuleTracking
{
    public class TrackingProfileHelper
    {
        private String strConn = String.Empty;
        public TrackingProfileHelper(String connString)
        {
            strConn = connString;
        }
       
        public TrackingProfile RetrieveProfile(Type workflowType)
        {
            TrackingProfile profile = null;
            try
            {
                String profileXml = null;
                using (SqlConnection conn= new SqlConnection(strConn))
                {
                    SqlCommand command = new SqlCommand("GetTrackingProfile", conn);
                    command.CommandType = CommandType.StoredProcedure;
                    command.Parameters.Add(new SqlParameter(
"@TypeFullName", workflowType.FullName)); command.Parameters.Add(new SqlParameter( "@AssemblyFullName", workflowType.Assembly.FullName)); command.Parameters.Add(new SqlParameter( "@Version", null)); command.Parameters.Add(new SqlParameter( "@CreateDefault", true)); command.Connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { profileXml = reader["TrackingProfile"] as String; } reader.Close(); } } if (profileXml != null) { TrackingProfileSerializer serializer= new TrackingProfileSerializer(); using (StringReader reader = new StringReader(profileXml)) { profile = serializer.Deserialize(reader); } } } catch (SqlException e) { Console.WriteLine("SqlException in RetrieveProfile: {0}", e.Message); throw;
} return profile; } public void UpdateProfile(TrackingProfile profile, Type workflowType) { try { String profileXml = null; TrackingProfileSerializer serializer= new TrackingProfileSerializer(); using (StringWriter writer = new StringWriter(new StringBuilder())) { serializer.Serialize(writer, profile); profileXml = writer.ToString(); } if (profileXml != null) { using (SqlConnection conn= new SqlConnection(strConn)) { SqlCommand command = new SqlCommand( "UpdateTrackingProfile", conn); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter( "@TypeFullName", workflowType.FullName)); command.Parameters.Add(new SqlParameter( "@AssemblyFullName", workflowType.Assembly.FullName)); command.Parameters.Add(new SqlParameter( "@Version", profile.Version.ToString())); command.Parameters.Add(new SqlParameter( "@TrackingProfileXml", profileXml)); command.Connection.Open(); command.ExecuteNonQuery(); } } } catch (SqlException e) { Console.WriteLine("SqlException in UpdateProfile: {0}", e.Message); throw; } }
public void DeleteProfile(Type workflowType) { try { using (SqlConnection conn= new SqlConnection(strConn)) { SqlCommand command = new SqlCommand( @"DELETE FROM TrackingProfile WHERE WorkflowTypeId IN (SELECT TypeId FROM Type WHERE TypeFullName = @TypeFullName AND AssemblyFullName = @AssemblyFullName)",conn); command.Parameters.Add(new SqlParameter( "@TypeFullName", workflowType.FullName)); command.Parameters.Add(new SqlParameter( "@AssemblyFullName", workflowType.Assembly.FullName)); command.Connection.Open(); command.ExecuteNonQuery(); } } catch (SqlException e) { Console.WriteLine("SqlException in DeleteProfile: {0}", e.Message); throw; } } } }

自定义Tracking Profile

1.我们使用WF中的跟踪服务(3):使用SqlTrackingService跟踪规则这文中的例子,我们只需要跟踪活动的Executing和Closed状态来查看踪RuleSet中A B C D各个值在PolicyActivity执行前后的变化情况。代码如下:

private static void AddCustomTrackingProfile()
{           
    TrackingProfileHelper helper = new TrackingProfileHelper(strConn);
    TrackingProfile profile = helper.RetrieveProfile(
                typeof(CarySqlRuleTracking.CarySqlRuleTrackingWorkflow));
    if (profile != null)
    {               
        ActivityTrackingLocation location = new ActivityTrackingLocation();
        location.ActivityTypeName = "PolicyActivity";
        location.ExecutionStatusEvents.Add(ActivityExecutionStatus.Executing);
        ActivityTrackPoint point = new ActivityTrackPoint();
        point.Extracts.Add(new WorkflowDataTrackingExtract("A"));
        point.Extracts.Add(new WorkflowDataTrackingExtract("B"));
        point.Extracts.Add(new WorkflowDataTrackingExtract("C"));
        point.Extracts.Add(new WorkflowDataTrackingExtract("D"));
        point.Annotations.Add("--RuleSet执行之前--");
        point.MatchingLocations.Add(location);
        profile.ActivityTrackPoints.Add(point);
location = new ActivityTrackingLocation(); location.ActivityTypeName = "PolicyActivity"; location.ExecutionStatusEvents.Add(ActivityExecutionStatus.Closed); point = new ActivityTrackPoint(); point.Extracts.Add(new WorkflowDataTrackingExtract("A")); point.Extracts.Add(new WorkflowDataTrackingExtract("B")); point.Extracts.Add(new WorkflowDataTrackingExtract("C")); point.Extracts.Add(new WorkflowDataTrackingExtract("D")); point.Annotations.Add("--RuleSet执行之后--"); point.MatchingLocations.Add(location); profile.ActivityTrackPoints.Add(point); profile.Version = new Version(profile.Version.Major, profile.Version.Minor + 1, 0);
helper.UpdateProfile(profile,typeof(CarySqlRuleTracking.CarySqlRuleTrackingWorkflow)); }
}
private static void DeleteCustomTrackingProfile()
{
    TrackingProfileHelper helper = new TrackingProfileHelper(strConn);
    helper.DeleteProfile(typeof(CarySqlTracking.CaryRuleWorkflow));
}

2.在WF中的跟踪服务(3):使用SqlTrackingService跟踪规则文章中例子的基础上,宿主程序中工作流实例执行前后添加如下代码:

AddCustomTrackingProfile();
DeleteCustomTrackingProfile();

3.执行结果如下图:

TrackingProfile1

MSDN中有一个“跟踪配置文件设计器”示例,这个例子值得大家好好研究下,地址:ms-help://MS.MSDNQTR.v90.chs/wcf_wf_samples/html/a280199c-3000-4148-ac63-cb5aaeac07c8.htm

分享到:
评论

相关推荐

    WF从入门到精通(第五章):workflow跟踪源码

    2. **跟踪配置**:在应用程序配置文件中定义跟踪配置,包括选择跟踪订阅者、设置跟踪级别(如信息、警告、错误等)和定义跟踪数据的筛选器。这些配置决定了哪些跟踪数据被记录和发送给订阅者。 3. **跟踪参与者**:...

    WF4.0 实战(二十一):Windows Server AppFabric中宿主WF4.0应用程序.doc

    【Windows Server AppFabric 与 ...持久化和跟踪配置确保了业务流程在异常情况下的恢复能力和问题排查能力。Windows Server AppFabric的使用,使得WF4.0应用程序能够更有效地处理工作流,提高整体系统的可靠性和性能。

    WCF4高级编程Professional.WCF.4

    理解配置文件的结构和用途,以及如何在代码中动态配置服务。 3. **绑定与传输协议**:探索各种内置的WCF绑定,如HTTP、TCP、命名管道等,理解它们的工作原理以及如何选择合适的绑定。同时,还会涉及自定义绑定的...

    WF从入门到精通(1-16章)

    ### WF从入门到精通知识点概览 ...- **配置文件**:介绍如何使用XML配置文件来定义工作流,包括语法结构、常用元素等。 - **动态调整**:讨论如何在运行时动态调整工作流的行为,比如根据输入参数更改工作流逻辑等。

    工作流WF4.0入门(八)

    在"工作流WF4.0入门(八)"中,作者详细阐述了如何在VS2012和C#环境中创建和配置自定义活动以及跟踪系统。通过阅读原文(链接:http://blog.csdn.net/mathieuxiao/article/details/8685507),读者可以学习到实际...

    WF企业级应用实例源代码(全)

    4. **工作流服务**:WF支持WCF服务,允许工作流作为服务运行。这些源码可能包含了创建和消费WF服务的实例。 5. **工作流生命周期管理**:可能包含如何启动、暂停、重启、完成和取消工作流的示例。 6. **跟踪和诊断...

    WF工作流的一个完整例子

    通过阅读这份文档,开发者可以学习如何定义活动、组合工作流、配置服务,以及如何利用WF调试器进行问题排查。文档可能会涵盖以下内容: 1. 创建自定义活动:讲解如何定义新的行为或逻辑,将其封装为WF活动。 2. ...

    Pro WF 4.5.pdf

    在本章节中,将向读者介绍创建和设计自定义活动的详细步骤,以及如何在工作流中使用这些活动。 第八章持久化工作流(Persisting Workflows):为了处理长时间运行的业务过程,WF 4.5提供了工作流的持久化机制,允许...

    workflow工作流例子(WF4)

    WF4,全称为Windows Workflow Foundation 4,是.NET Framework 4.0中的一个组件,用于构建业务流程和工作流应用程序。WF4提供了一种声明式的方式来设计、执行和管理工作流,它使得开发人员能够专注于业务逻辑,而...

    ASP.NET WF的例子

    通过打开这个文件,开发者可以查看项目中的各个组件,包括代码文件、配置文件等。 `MyWWF.suo`是Visual Studio的用户特定设置文件,包含调试设置、窗口布局等信息,不直接影响代码运行,但对开发环境有影响。 `sql...

    WF财务审核源码(wpf)

    4. **WF配置和定义**:这部分源码定义了工作流的行为,包括审批流程的顺序、条件分支、角色分配等。可能包含XML文件或代码来描述工作流实例。 5. **事件驱动编程**:WF支持事件驱动模型,源码中可能包含响应特定...

    WF源码资料

    4. **跟踪服务**:用于监控和记录工作流执行过程,便于调试和分析。学习跟踪服务的实现能帮助你更好地理解和优化工作流性能。 5. **设计器组件**:提供图形化的拖放界面,用于创建和修改工作流。源码可能包含自定义...

    《WF本质论》附书源码.rar

    WF与.NET Framework的其他组件紧密集成,例如WCF(Windows Communication Foundation)用于服务交互,WPF(Windows Presentation Foundation)用于丰富的用户界面,这使得WF可以无缝地融入到企业级的分布式系统中。...

    使用VS2008开发WCF、WPF、WF项目

    - **高度可配置**: 服务的行为和属性可以通过配置文件来定义,减少了硬编码的需求。 #### Windows Presentation Foundation (WPF) Windows Presentation Foundation (WPF) 是一个用于创建用户界面的技术,它为...

    workflow 示例 wf4.0 示例 官方示例

    - **事务性工作流**:展示如何在工作流中使用ACID事务,确保数据一致性。 - **服务工作流**:讲解如何将工作流作为WCF服务暴露,以及如何消费这些服务。 - **规则引擎集成**:说明如何利用System.Workflow....

    在asp.net下用WF开发的工作流实例

    本实例将探讨如何在ASP.NET中使用WF进行工作流开发。 首先,Windows Workflow Foundation是.NET Framework的一部分,它提供了一个平台来设计、执行和管理工作流。WF支持四种主要的工作流模型:顺序流程、状态机流程...

    WF从入门到精通(第七章):基本活动的操作源码

    除了使用内置的基本活动外,WF还允许开发者创建自定义活动,以满足特定的业务需求。通过查看和分析提供的源码,你可以学习如何扩展WF,定义自己的活动类,并集成到工作流程中。 5. **活动设计与执行** 学习如何在...

    Asp.net工作流(WF+LINQ).rar

    在"压缩包子文件的文件名称列表"中提到的"Asp.net工作流"可能是一个ASP.NET项目文件夹,其中包含了WF的配置文件、工作流定义(XAML文件)、服务接口(如WCF服务)以及与工作流相关的代码文件。 工作流设计通常包括...

Global site tag (gtag.js) - Google Analytics