`

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 
我们的跟踪信息已经写入到指定的文件中了,当然我们只是做了最基本的工作。
分享到:
评论

相关推荐

    MATLAB-四连杆机构的仿真+项目源码+文档说明

    <项目介绍> - 四连杆机构的仿真 --m3_1.m: 位置问题求解 --m2_1.m: 速度问题求解 --FourLinkSim.slx: Simlink基于加速度方程的仿真 --FourLinkSim2.slx: Simscape简化模型仿真 --FourLinkSim3.slx: Simscape CAD模型仿真 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    ridge_regression:用于岭回归的python代码(已实现以预测下个月的CO2浓度)

    ridge_regression 用于岭回归的python代码(已实现以预测下个月的CO2浓度) 资料可用性 文件 Ridge.py :标准函数和Ridge回归函数window_make.py :使用滑动窗口方法制作大小为p(窗口大小)的时间序列列表。 Final_version.ipynb :使用Co2数据对代码进行实验

    Polygon3-3.0.8-cp35-cp35m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    【java毕业设计】风俗文化管理系统源码(ssm+mysql+说明文档+LW).zip

    功能说明: 系统主要分为系统管理员和用户两个部分,系统管理员主要功能包括首页,个人中心,用户管理,节日风俗管理,饮食风俗管理,服饰风俗管理,礼仪风俗管理,信仰风俗管理,建筑风俗管理,我的收藏管理,留言板管理,论坛管理,系统管理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    中国城市温度历史数据(2000-2020)-最新全集.zip

    中国城市温度历史数据(2000-2020)-最新全集.zip

    中国土地利用现状遥感监测数据(1km)-最新.zip

    中国土地利用现状遥感监测数据(1km)-最新.zip

    pgmagick-0.7.5-cp35-cp35m-win_amd64.whl.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    yolo算法-香烟盒子数据集-320张图像带标签-.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    java资源Google API for Java

    java资源Google API for Java提取方式是百度网盘分享地址

    中国分地区地级市泰尔指数数据集(2000-2019).zip

    中国分地区地级市泰尔指数数据集(2000-2019).zip

    【java毕业设计】高职院校教学中心可视化教学分析系统源码(ssm+mysql+说明文档).zip

    环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    【java毕业设计】整体衣柜定制系统源码(ssm+mysql+说明文档).zip

    环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    【java毕业设计】房屋出租系统源码(ssm+mysql+说明文档+LW).zip

    功能说明: 系统功能实现了首页,房源信息,交流论坛,公告资讯,个人中心,后台管理等功能。系统的后台实现了个人中心,用户管理,房东管理,房源类型管理,房源信息管理,在线咨询管理,预约信息管理,订单信息管理,签订信息管理,申请退租管理,交流论坛,系统管理等功能的添加、删除和修改。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上

    yolo算法-电线杆数据集-1493张图像带标签-.zip

    yolo算法-电线杆数据集-1493张图像带标签-.zip;yolo算法-电线杆数据集-1493张图像带标签-.zip;yolo算法-电线杆数据集-1493张图像带标签-.zip

    安装包eclipse-jee-neon-3-win32-x86-64

    安装包eclipse-jee-neon-3-win32-x86_64提取方式是百度网盘分享地址

    param-1.12.2-py2.py3-none-any.whl.rar

    PartSegCore_compiled_backend-0.12.0a0-cp36-cp36m-win_amd64.whl.rar

    Pillow_SIMD-6.0.0.post0+avx2-cp27-cp27m-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    peewee-3.14.10-cp37-cp37m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    中国各省GDP及农业主要指标数据集(1999-2019).zip

    中国各省GDP及农业主要指标数据集(1999-2019).zip

    ‌Nginx事件驱动模型深度解析‌

    ‌Nginx事件驱动模型深度解析‌

Global site tag (gtag.js) - Google Analytics