`

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从入门到精通(第十三章):打造自定义活动(一)源码

    6. **发布和使用**:完成自定义活动后,可以将其打包成.dll文件,然后在其他WF项目中引用。这样,自定义活动就可供整个团队使用,提高了代码复用和一致性。 在"Chapter13"压缩包文件中,很可能是包含了本章的所有源...

    坚持学习WF

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

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

    通过学习WF的workflow跟踪源码,你可以了解到如何自定义跟踪定义以满足特定需求,如何实现自定义跟踪参与者以扩展跟踪功能,以及如何调整跟踪配置以优化性能和日志记录。此外,源码分析还能帮助你在遇到问题时快速...

    workflow 自定义控件

    在.NET Framework中,我们可以使用Windows Workflow Foundation (WF) 来创建自定义活动。 2. **创建自定义活动类**: 在C#或VB.NET中,我们需要创建一个继承自`System.Activities.Activity`或其子类的类。这个类将...

    WF工作流学习资料

    6. **WF与WCF集成**:WF和Windows Communication Foundation(WCF)紧密集成,允许工作流作为服务公开,或者调用其他服务。这使得WF工作流可以轻松地参与分布式系统中的服务交互。 7. **WF版本发展**:WF经历了从...

    web wf 设计器

    在本篇中,我们将深入探讨Web WF设计器的核心概念、功能以及其在IT领域的应用。 1. 工作流(Workflow)基础 工作流是指组织内部或跨组织的一系列任务和活动,按照预定的规则和顺序执行,以完成一项业务目标。WF...

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

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

    wf4cookbook中文

    7. **工作流服务**:涵盖了如何将WF4集成到WCF(Windows Communication Foundation)中,构建基于工作流的服务。 8. **跟踪和诊断**:介绍如何设置跟踪和日志记录,以便于调试和监控工作流的执行。 9. **版本管理...

    pro wf windows workflow in dot net 3.5

    7. **工作流跟踪和诊断**:讲解了如何使用WF内置的跟踪和日志功能,以及如何通过自定义跟踪参与程序来增强监控和诊断能力。 8. **工作流版本管理和迁移**:讨论了如何处理工作流的版本升级,以及如何在不中断服务的...

    坚持学习WF(1):从HelloWorld开始 源码

    深入WF的学习,还需要掌握活动库的使用、自定义活动的创建、持久化机制、工作流服务(WF45中的WCF Workflow Service)以及与WF相关的设计模式。这将帮助你构建更复杂、灵活且适应性强的业务流程解决方案。 总结来说...

    Apress - Beginning WF: Windows Workflow in .NET 4.0 Mar 2010

    - **第13章:跟踪**:讲解如何在工作流执行过程中进行跟踪和监控。 - **第14章:事务**:探讨如何在工作流中使用事务来保证数据完整性。 - **第15章:带有持久性的事务**:介绍如何结合事务和持久化机制来增强...

    工作流WF4.0入门(八)

    在本文中,我们将深入探讨WF4.0的自定义活动和跟踪技术,这是开发高效、灵活的工作流解决方案的关键组成部分。 首先,让我们了解WF4.0的基本概念。WF4.0全称为Windows Workflow Foundation 4.0,它提供了一个平台,...

    WFDesigner workflow

    6. 集成能力:WFDesigner可以无缝集成到其他.net应用程序中,如ASP.NET、WPF等,为整个业务系统提供工作流支持。 7. 版本控制:对于复杂的企业级项目,WFDesigner通常会包含版本控制功能,允许开发者对工作流模型...

    流程自定义

    可以使用WF的跟踪服务记录工作流的执行信息,然后通过分析这些数据来诊断问题或改进流程。 在压缩包"Flow"中,可能包含了一些示例代码或者项目文件,用于展示如何在ASP.NET中实现流程自定义。通过查看这些文件,...

    wf开发文档

    2. **设计与创建工作流**:讲解如何使用Visual Studio中的WF设计器创建自定义活动和工作流。这可能包括图形化设计、代码编辑和XAML(Extensible Application Markup Language)表示。 3. **活动模型**:阐述基本...

    WF从入门到精通源码和中文版pdf

    6. **调试和跟踪**:书中应该会讨论如何调试WF应用程序,包括设置断点、查看工作流实例的状态以及使用跟踪来诊断问题。 7. **源码分析**:提供的源码部分,可能包含了作者对WF核心组件或示例的实现,这有助于读者...

    WF4.0网络教程(含示例代码)

    最后,工作流服务通过结合WF4.0和WCF(Windows Communication Foundation)技术,使得创建基于服务的工作流变得简单,这在SOA(面向服务架构)环境中尤为有用。 WF4.0引入了几个关键概念,如活动(Activity)、执行...

    WF本质论源码

    6. **宿主环境(Host Environment)**:WF工作流可以被宿主在各种环境中,如ASP.NET、WCF服务或独立的应用程序。宿主负责创建和管理工作流实例。 7. **持久化(Persistence)**:WF支持将工作流实例的状态保存到...

Global site tag (gtag.js) - Google Analytics