`

WF中的跟踪服务(6):如何自定义跟踪服务

阅读更多

相关文章:
WF中的跟踪服务(1):Sql跟踪数据库表,视图,存储过程等相关说明
WF中的跟踪服务(2):使用SqlTrackingService
WF中的跟踪服务(3):使用SqlTrackingService跟踪规则
WF中的跟踪服务(4):使用跟踪配置文件
WF中的跟踪服务(5):SqlTrackingService 的数据维护

在前几篇文章中我们都是围绕这SqlTrackingService这一WF内置的跟踪服务来讲述的。有的时候我们有自己特殊的需求,比如我不想把这个跟踪数据存到Sql数据库中,比如我想把跟踪信息发送到制定的邮件中等。我们这个时候就可以实现自己的跟踪服务。本文我将用最少的代码来实现一个文件跟踪服务,将跟踪信息存到文件中。

开发自定义跟踪服务我们要实现两个类,实现跟踪通道TrackingChannel和跟踪服务TrackingService。 跟踪通道接收运行时发送的跟踪记录。运行时跟踪基础结构使用此跟踪通道将与工作流实例关联的跟踪记录发送回宿主应用程序。应用程序可以采用您选择的任何方式处理此跟踪信息。例如,SqlTrackingService将跟踪信息写入 SQL 数据库。 跟踪服务根据具体参数和条件为运行时提供跟踪配置文件。 它还负责提供可接收运行时所发送数据的跟踪通道。

一:实现Tracking Channel

我们首先实现一个FileTrackingChannel类,代码如下:

public class FileTrackingChannel:TrackingChannel
{
   TrackingParameters tPara = null;
   StreamWriter streamWriter = File.CreateText("CaryWorkflowTrackLog.txt"); 
string strWorkflowTrackLog = "";
public FileTrackingChannel(TrackingParameters tPara) { this.tPara = tPara; } protected override void Send(TrackingRecord record) { if (record is WorkflowTrackingRecord) { WorkflowTrackingRecord wfRecord= record as WorkflowTrackingRecord; kflowTrackLog = "工作流实例信息:" + wfRecord.EventDateTime +" "+
wfRecord.TrackingWorkflowEvent; WriteToFile(strWorkflowTrackLog); } if (record is ActivityTrackingRecord) { ActivityTrackingRecord actRecord= record as ActivityTrackingRecord; strWorkflowTrackLog = "活动信息:" + actRecord.EventDateTime + " "+
actRecord.ActivityType.Name; WriteToFile(strWorkflowTrackLog); }
if (record is UserTrackingRecord) { UserTrackingRecord userRecord= record as UserTrackingRecord; if (userRecord.UserData is RuleActionTrackingEvent) { RuleActionTrackingEvent ruleAction= userRecord.UserData as RuleActionTrackingEvent; strWorkflowTrackLog = "用户信息:" + userRecord.EventDateTime+" "
+ ruleAction.RuleName + ruleAction.ConditionResult; WriteToFile(strWorkflowTrackLog); } else { strWorkflowTrackLog = "用户信息:" + userRecord.EventDateTime+" " +
userRecord.UserData; WriteToFile(strWorkflowTrackLog); } } } protected override void InstanceCompletedOrTerminated() { WriteToFile("log记录完成,ID:"+tPara.InstanceId.ToString()); } private void WriteToFile(string trackLogContent) { streamWriter.AutoFlush = true; streamWriter.WriteLine(trackLogContent); }
}

Send方法是两个必须实现抽象方法之一,每当有跟踪数据传递给跟踪服务的时候该方法都会通过工作流引擎被调用。该方法传第一个TrackingRecord参数,可以是三种跟踪记录类型中的任意一种。InstanceCompletedOrTerminated方法是另一个必须实现的方法。该方法在工作流实例完成或终止时被调用。在该类中我们将跟踪信息写到制定的文件中。

二:实现TrackingService
下面我们来实现FileTrackingService类,代码如下:
public class FileTrackingService:TrackingService
{
    private TrackingProfile defaultProfile;

    public FileTrackingService(): base()
    {            
        defaultProfile = GetDefaultProfile();
    }  
protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters) { return new FileTrackingChannel(parameters); }
protected override TrackingProfile GetProfile(Guid workflowInstanceId) { return defaultProfile; }
protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId) { return defaultProfile; } protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile) { profile = defaultProfile; return true; } protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId,
out TrackingProfile profile) { profile = null; return false; } private TrackingProfile GetDefaultProfile() { TrackingProfile profile = new TrackingProfile(); WorkflowTrackPoint workflowPoint= new WorkflowTrackPoint(); List<TrackingWorkflowEvent> workflowEvents= new List<TrackingWorkflowEvent>(); workflowEvents.AddRange(Enum.GetValues(typeof(TrackingWorkflowEvent)) as IEnumerable<TrackingWorkflowEvent>); WorkflowTrackingLocation workflowLocation= new WorkflowTrackingLocation(workflowEvents); workflowPoint.MatchingLocation = workflowLocation; profile.WorkflowTrackPoints.Add(workflowPoint); ActivityTrackPoint activityPoint= new ActivityTrackPoint(); List<ActivityExecutionStatus> activityStatus= new List<ActivityExecutionStatus>(); activityStatus.AddRange(Enum.GetValues(typeof(ActivityExecutionStatus)) as IEnumerable<ActivityExecutionStatus>); ActivityTrackingLocation activityLocation= new ActivityTrackingLocation( typeof(Activity), true, activityStatus); activityPoint.MatchingLocations.Add(activityLocation); profile.ActivityTrackPoints.Add(activityPoint); UserTrackPoint userPoint = new UserTrackPoint(); UserTrackingLocation userLocation = new UserTrackingLocation( typeof(Object), typeof(Activity)); userLocation.MatchDerivedActivityTypes = true; userLocation.MatchDerivedArgumentTypes = true; userPoint.MatchingLocations.Add(userLocation); profile.UserTrackPoints.Add(userPoint); profile.Version = new Version(1, 0, 0); return profile; }
}

自定义的跟踪服务有两个任务。首先是提供Tracking Profiles给工作流引擎。其次他返回一个跟踪管道的实例给工作流引擎。我们找个FileTrackingService是不支持自定义的Tracking Profile的。

三。使用FileTrackingService

我们在宿主程序中将该FileTrackingService添加在WorkflowRuntime中,如下:

FileTrackingService fts = new FileTrackingService();
workflowRuntime.AddService(fts);
在工作流中我们放一个CodeActivity,其ExecuteCode事件代码如下:
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("codeActivity1执行了!");
    TrackData("CaryUserData", "CaryUserDataRecord");
}
执行工作流结果如下图:
FileTrackingService 
我们的跟踪信息已经写入到指定的文件中了,当然我们只是做了最基本的工作。
分享到:
评论

相关推荐

    坚持学习WF,WF学习教程

    WF 提供的通信模型是构建于队列系统的基础之上,我们可以使用自定义活动来注册以接收关于队列的消息,而宿主应用程序中的服务则发送关于队列的消息。自定义活动可以使用此模型来处理外部事件,也可以传递异步活动...

    坚持学习WF

    坚持学习WF(11):工作流通信与队列 WF 提供的通信模型是构建于队列系统的基础之上,我们可以使用自定义活动来注册以接收关于队列的消息,而宿主应用程序中的服务则发送关于队列的消息。自定义活动可以使用此模型来...

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

    第一章:WF简介 第二章:WORKFLOW运行时 第三章:WORKFLOW实例 第四章:活动及WORKFLOW类型介绍 第五章:WORKFLOW跟踪 第六章:加载和卸载实例 第七章:基本活动的操作 第八章:调用外部方法及工作流 第九章:逻辑流...

    Code(WF从入门到精通).rar

    第一章:WF简介 第二章:WORKFLOW运行时 第三章:WORKFLOW实例 第四章:活动及WORKFLOW类型介绍 第五章:WORKFLOW跟踪 第六章:加载和卸载实例 第七章:基本活动的操作 第八章:调用外部方法及工作流 第九章:逻辑流...

    Beginning+WF4.0应用到 asp.net源码实例

    wf4.0应用asp.net 这个示例将包括WF4.0的大部分知识点。包括: 1、持久化服务 2、跟踪服务 3、自定义扩展 4、WCF Workflow Service 5、WorkflowServiceHost 6、使用Interop活动去调用WF3.0工作流程

    工作流WF4.0入门(八)

    使用VS2012 + C#,介绍了WF4.0 自定义活动以及跟踪技术,原文:http://blog.csdn.net/mathieuxiao/article/details/8685507

    workflow资料

    │ │ TrackData 添加用户跟踪.doc │ │ TrackingProfile 跟踪服务筛选器.doc │ │ TrackingService 、TrackingChannel 自定义跟踪服务.doc │ │ │ └─Tracking数据库脚本文件 │ ...

    wpf源码大全 精通C#3.0图书源码 详细源码 学习好用

    VS2008Application 在VS2008中创建自定义的Application类。 第10章(\C10) 示例描述:本章学习WPF提供的布局特性。 CanvasDemo 使用Canvas进行布局。 DockPanelDemo 使用DockPanel进行布局。 Grid...

    framword4.5

    其他功能包括:带自跟踪实体的更好的 n 层支持、使用 T4 模板的可自定义的代码生成、模型首次开发、改进的设计器体验、更好的性能以及实体集的复数形式。 有关更多信息,请转到此处。 WCF 数据服务是 .NET ...

    Microsoft .NET Framework 4

    其他功能包括:带自跟踪实体的更好的 n 层支持、使用 T4 模板的可自定义的代码生成、模型首次开发、改进的设计器体验、更好的性能以及实体集的复数形式。 有关更多信息,请转到此处。 WCF 数据服务是 .NET ...

    业务设计与运行平台 软件

    对数值数据进行分类汇总和聚合,支持多级汇总,可以更改汇总函数,添加自定义计算和公式。支持异构数据库统计、多表数据综合统计。支持中国式复杂报表。 4.与Excel兼容 1)与Excel格式兼容,支持E-data系统内数据以...

    E-data业务设计与运行平台

    对数值数据进行分类汇总和聚合,支持多级汇总,可以更改汇总函数,添加自定义计算和公式。支持异构数据库统计、多表数据综合统计。支持中国式复杂报表。 4.与Excel兼容 1)与Excel格式兼容,支持E-data系统内数据以...

    SwissNow - ServiceNOW toolbox-crx插件

    自定义实用程序脚本(=参数化背景脚本)6.配置包 - 只需单击一下,将多个表的导出到单个文件中的记录7.比较不同环境的相同记录或相同的记录列表。多线值(例如脚本)突出显示更改的行。列表上的工作流程(WF_...

    E-data业务设计与运行平台 v2.1.0.0.zip

    对数值数据进行分类汇总和聚合,支持多级汇总,可以更改汇总函数,添加自定义计算和公式。支持异构数据库统计、多表数据综合统计。支持中国式复杂报表。 4.与Excel兼容 1)与Excel格式兼容,支持E-data系统内数据...

Global site tag (gtag.js) - Google Analytics