WF4.0 基础篇 (二十二) Tracking

Tracking 介绍

WF跟踪是用来记录工作流执行情况

WF跟踪由以下几部分组成:

跟踪记录

Tracking Records

从工作流运行时发出

跟踪配置

Tracking Profile

用来筛选从工作流实例中发出的跟踪记录

跟踪参与者

Tracking Participants

用来订阅跟踪记录。跟踪参与者包括处理来自跟踪记录的负载的逻辑

ActivityInfo

System.Activities.Tracking.ActivityInfo

TrackingProvider

System.Activities.Tracking.TrackingProvider

 

跟踪记录 TrackingRecord 

跟踪记录[TrackingRecord]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingRecord

 

TrackingRecord为[Abstract],WF4自带了以下功能[TrackingRecord]

 

CustomTrackingRecord

可在Activity中使用[context.Track(CustomTrackingRecord)]方式添加自定义跟踪记录

   
   
   
   
   
   
   

 

 

跟踪配置 TrackingProfile

跟踪配置[TrackingProfile]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingProfile

 

Queries类型为[System.Collections.ObjectModel.Collection<System.Activities.Tracking.TrackingQuery>],,WF4自带了以下功能[TrackingQuery]

 

工作流追踪包括两个主要组件:追踪参与和追踪配置。追踪配置定义了您希望运行时需要追踪的事件和数据,配置(Profiles)包括以下三种重要的查询类型: 

 

 

 

 

 

ActivityStateQuery

用于指定活动的状态(如关闭)、提取数据的变量和参数

 

[States属性]:由System.Activities.Tracking.ActivityStates的[Fieldes]提供

WorkflowInstanceQuery

用于指定工作流事件

 

[States属性]:由System.Activities.Tracking.WorkflowInstanceStates的[Fieldes]提供

CustomTrackingQuery

用于指定对追踪数据的明确调用,常用语自定义的活动中

 

 

 

 

 

跟踪参与者TrackingParticipant

跟踪参与者 [TrackingParticipant]

DLL:System.Activities.dll

类名:System.Activities.Tracking.TrackingProfile

abstract

要自定义[跟踪参与者]要从该类继承

 

 

 

自定义跟踪参与者

例子下载:

http://files.cnblogs.com/foundation/CustomTrackingSample.rar

自定义跟踪参与者

public class myTrackingParticipant : System.Activities.Tracking.TrackingParticipant

   {

private const String participantName = "wxwinter_myTrackingParticipant";

 

public myTrackingParticipant()

        {

Console.WriteLine( "{0} Created", participantName);

        }

 

 

protected override void Track(System.Activities.Tracking.TrackingRecord record, TimeSpan timeout)

        {

Console.Write( "{0} emitted trackRecord: {1}  Level: {2}, RecordNumber: {3}",  participantName, record.GetType().FullName,  record.Level, record.RecordNumber);

 

            System.Activities.Tracking.WorkflowInstanceRecord workflowInstanceRecord = record as System.Activities.Tracking.WorkflowInstanceRecord;

if (workflowInstanceRecord != null)

            {

Console.WriteLine( " Workflow InstanceID: {0} Workflow instance state: {1}", record.InstanceId, workflowInstanceRecord.State);

            }

 

            System.Activities.Tracking.ActivityStateRecord activityStateRecord = record as System.Activities.Tracking.ActivityStateRecord;

if (activityStateRecord != null)

            {

IDictionary<String, object> variables = activityStateRecord.Variables;

                

StringBuilder vars = new StringBuilder();

 

if (variables.Count > 0)

                {

                    vars.AppendLine("\n\tVariables:");

foreach (KeyValuePair<string, object> variable in variables)

                    {   

                        vars.AppendLine(String.Format( "\t\tName: {0} Value: {1}", variable.Key, variable.Value));

                    }

                }

Console.WriteLine( " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",  activityStateRecord.Activity.Name, activityStateRecord.State, ((variables.Count > 0) ? vars.ToString() : String.Empty));

            }

 

            System.Activities.Tracking.CustomTrackingRecord customTrackingRecord = record as System.Activities.Tracking.CustomTrackingRecord;

if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))

            {

Console.WriteLine("\n\tUser Data:");

foreach (string data in customTrackingRecord.Data.Keys)

                {

Console.WriteLine(" \t\t {0} : {1}", data, customTrackingRecord.Data[data]);

                }

            }

Console.WriteLine();

 

        }

    }

 

定义Profile

public class myTrackingTools

   {

public static System.Activities.Tracking.TrackingParticipant getTracking()

       {

//(1) TrackingProfile

           System.Activities.Tracking.TrackingProfile trackingProfile = new System.Activities.Tracking.TrackingProfile();

           trackingProfile.Name = "wxwinterTrackingProfile";

 

//(1.1)

           System.Activities.Tracking.CustomTrackingQuery customQuery = new System.Activities.Tracking.CustomTrackingQuery();

           customQuery.Name = "*";

           customQuery.ActivityName = "*";

 

//(1.2)

           System.Activities.Tracking.WorkflowInstanceQuery instanceQuery = new System.Activities.Tracking.WorkflowInstanceQuery();

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Aborted);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Canceled);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Completed);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Idle);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Persisted);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Resumed);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Started);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Suspended);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Terminated);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.UnhandledException);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Unloaded);

           instanceQuery.States.Add(System.Activities.Tracking.WorkflowInstanceStates.Unsuspended);

 

//(1.3)

           System.Activities.Tracking.ActivityStateQuery activityQuery = new System.Activities.Tracking.ActivityStateQuery();

           activityQuery.ActivityName = "*";

           activityQuery.States.Add("*");  //  System.Activities.Tracking.ActivityStates.Executing  // System.Activities.Tracking.ActivityStates.Canceled  

 

           activityQuery.Variables.Add("*");

           activityQuery. Arguments.Add("*");

 

//(1.4)

           trackingProfile.Queries.Add(customQuery);

           trackingProfile.Queries.Add(instanceQuery);

           trackingProfile.Queries.Add(activityQuery);

 

 

//(2)

myTrackingParticipant myTracking = new myTrackingParticipant();

           myTracking.TrackingProfile = trackingProfile;

 

return myTracking;

       }

   }

 

具有CustomTrackingRecord功能的Activity

public sealed class myActivity : CodeActivity

    {

protected override void Execute(CodeActivityContext context)

        {

Console.WriteLine("myActivity Execute");

 

            System.Activities.Tracking.CustomTrackingRecord myRecord = new System.Activities.Tracking.CustomTrackingRecord("myActivity_CustomTrackingRecord");

 

            myRecord.Data.Add("wxd", 12345);

 

            myRecord.Data.Add("wxwinter", "lzm");

 

            context.Track(myRecord);

 

        }

    }

 

 

使用

工作流

宿主

class Program

    {

static void Main(string[] args)

        {

            System.Console.WindowWidth = 150;

         

//-----------------------------------------------------------------------------------

//WorkflowApplication

WorkflowApplication instance = new WorkflowApplication(new testWorkflow());

 

            instance.Extensions.Add(myTrackingTools.getTracking());

 

            instance.Run();

 

//------------------------------------- or ------------------------------------------

//WorkflowInvoke

// WorkflowInvoker invoker = new WorkflowInvoker(new testWorkflow());

 

//  invoker.Extensions.Add(myTrackingTools.getTracking());

 

// invoker.Invoke();

//---------------------------------------------------------------------------------

 

            System.Console.Read();

        }

      

    }

结果

 

 

EtwTrackingParticipant

 

[EtwTrackingParticipant]:(ETW:Enterprise Trace for Windows)

DLL:System.Activities.dll

类名:ystem.Activities.Tracking.EtwTrackingParticipant

ETW是Windows里本地组件的一个追踪系统,由操作系统中的包括驱动程序、其它核心级代码等很多组件和服务调用。写入到ETW的数据可以通过定制代码或者诸如即将推出的Windows服务AppFabric等工具来使用。AppFabric将同ETW一起搜集ETW数据并将它存储到SQL数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值