📄 wxdtrackingservice.cs
字号:
using System;
using System.IO;
using System.Collections.Generic;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Tracking;
using System.Workflow.ComponentModel;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Activities.Rules;
namespace wxwinter.wf.Service
{
public class wxdTrackingChannel : TrackingChannel
{
private TrackingParameters trackInstance = null;
public IWriter writer;
//构造1-2
protected wxdTrackingChannel()
{ }
//构造2-2
public wxdTrackingChannel(TrackingParameters parameters, IWriter wr)
{
//该参数将得到TrackingParameters
//有被跟踪的实例的信息(很多)
writer = wr;
this.trackInstance = parameters;
writer.outMessage("Tracking通道构造函数", this.trackInstance.InstanceId.ToString());
}
//override
//Tracking runtime调用该方将实例完成的信息向外界抛
protected override void InstanceCompletedOrTerminated()
{
System.Collections.ArrayList ls = new System.Collections.ArrayList();
ls.Add("实例名称:" + trackInstance.WorkflowType.AssemblyQualifiedName);
ls.Add("实例ID:" + trackInstance.InstanceId.ToString());
ls.Add("CallerContextGuid: " + trackInstance.CallerContextGuid.ToString());
ls.Add("CallerInstanceId: " + trackInstance.CallerInstanceId.ToString());
ls.Add("CallerParentContextGuid: " + trackInstance.CallerParentContextGuid.ToString());
ls.Add("ContextGuid: " + trackInstance.ContextGuid.ToString());
ls.Add("RootActivity.QualifiedName: " + trackInstance.RootActivity.QualifiedName.ToString());
// ls.Add("CallPath.Count: " + 被跟踪的实例.CallPath.Count.ToString());
writer.outMessage("实例已完成或终止:InstanceCompletedOrTerminated", ls);
}
//override
//Tracking runtime调用该方法发送将监视到的各类tracking records向外界抛出
protected override void Send(TrackingRecord record)
{
// 对类型进行一下对象筛选,然后再跟据不同的对象进行不同的输出
//筛选实例
if (record is WorkflowTrackingRecord)
{
WorkflowTrackingRecord tempRecord = (WorkflowTrackingRecord)record;
System.Collections.ArrayList a = new System.Collections.ArrayList();
a.Add("实例状态: " + tempRecord.TrackingWorkflowEvent.ToString());
a.Add("实例ID:" + trackInstance.InstanceId.ToString());
a.Add("时间: " + tempRecord.EventDateTime.ToString());
object stateType = tempRecord.EventArgs;
//判断实例状态信息是否为挂起类型:Suspended
if (stateType is TrackingWorkflowSuspendedEventArgs)
{
TrackingWorkflowSuspendedEventArgs o1 = (TrackingWorkflowSuspendedEventArgs)stateType;
a.Add("●─→┌─────────────────────────────────────┐");
a.Add(" │ 实例状态信息为挂起类型:Suspended ");
a.Add(" │ " + "挂起信息: " + o1.Error);
a.Add(" └─────────────────────────────────────┘");
}
//判断实例状态信息是否为终止类型:Completed
if (stateType is TrackingWorkflowTerminatedEventArgs)
{
TrackingWorkflowTerminatedEventArgs o2 = (TrackingWorkflowTerminatedEventArgs)stateType;
a.Add("●─→┌─────────────────────────────────────┐");
a.Add(" │ 实例状态信息为终止类型:Completed ");
//如果是由异常引起的结止,显示该Exception信息,(Activity的)
if (null != o2.Exception)
{
a.Add(" │ " + "该终止是由异常引起的 ");
a.Add(" │ " + "异常终止信息: " + o2.Exception.Message.ToString());
}
else
{
a.Add(" │ " + "正常的完成流程的终止");
}
a.Add(" └─────────────────────────────────────┘");
}
//判断实例状态信息是否为异常类型:Exception
if (stateType is TrackingWorkflowExceptionEventArgs)
{
TrackingWorkflowExceptionEventArgs o3 = (TrackingWorkflowExceptionEventArgs)stateType;
a.Add("●─→┌─────────────────────────────────────┐");
a.Add(" │ 实例状态信息为异常类型:Exception ");
a.Add(" │ " + "该异由此Activity控件引发: " + o3.OriginalActivityPath.ToString());
//如果Exception信息不为空,显示该信息(Activity的)
if (null != o3.Exception)
{
a.Add(" │ " + "异常信息: " + o3.Exception.Message.ToString());
}
a.Add(" └─────────────────────────────────────┘");
}
/*
* 还有以下状态可
* Aborted
* Changed
* Completed
* Created
* Idle
* Loaded
* Persisted
* Started
* Unloaded
*/
writer.outMessage("Send:筛选实例", a);
}
//筛选结点
if (record is ActivityTrackingRecord)
{
ActivityTrackingRecord obj2 = (ActivityTrackingRecord)record;
System.Collections.ArrayList b = new System.Collections.ArrayList();
b.Add("Activity名子: " + obj2.QualifiedName.ToString());
b.Add("Activity类型: " + obj2.ActivityType);
b.Add("实 例ID:" + trackInstance.InstanceId.ToString());
b.Add("上下文ID:" + obj2.ContextGuid.ToString());
b.Add("时间: " + obj2.EventDateTime.ToString());
b.Add("状态: " + obj2.ExecutionStatus.ToString());
writer.outMessage("Send:筛选结点", b);
}
//筛选业务状态点(用户状态点)
if (record is UserTrackingRecord)
{
UserTrackingRecord obj3 = (UserTrackingRecord)record;
System.Collections.ArrayList c = new System.Collections.ArrayList();
c.Add("产生该记录点所在的Activity: " + obj3.QualifiedName.ToString());
c.Add("所在Activity的类型: " + obj3.ActivityType.FullName.ToString());
c.Add("实 例ID:" + trackInstance.InstanceId.ToString());
c.Add("上下文ID:" + obj3.ContextGuid.ToString());
c.Add("时间: " + obj3.EventDateTime.ToString());
c.Add("用户业务状态: " + obj3.UserData.ToString());
//筛选业务状态点(用户状态点)中的规则
if (obj3.UserData is System.Workflow.Activities.Rules.RuleActionTrackingEvent)
{
RuleActionTrackingEvent obj3_rule = (RuleActionTrackingEvent)obj3.UserData;
c.Add("●─→┌─────────────────────────────────────┐");
c.Add(" │ 这是一个用户状态点的规则(在筛选用户状态点中) ");
c.Add(" │ " + "规则名: " + obj3_rule.RuleName.ToString());
c.Add(" │ " + "规则状态: " + obj3_rule.ConditionResult.ToString());
c.Add(" └─────────────────────────────────────┘");
//Policy绑定的规则集中的每个规则都会发送一组状态,Policy有点像职责链,具体以后讲
//Policy规则是自动将信息抛出的,但在类型上算上用户状态
}
else
{
c.Add("●─→┌─────────────────────────────────────┐");
c.Add(" │ 该业务状态不是规则状态 ");
c.Add(" └─────────────────────────────────────┘");
}
writer.outMessage("Send:筛选业务状态点(用户状态点)", c);
}
}
}
public class wxdTrackingService : TrackingService
{
IWriter writer;
public wxdTrackingService(IWriter wr)
{
writer = wr;
}
protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile)
{
//引擎通过该方法加载监视方案
//可在该方法内为工作流模板与对应的筛选建一字典集合,
//该演示设计成所有工作流都使用同一筛选规则方式
//参数:workflowType,传入的类型,用于在字典集合中查找对应的筛选规则
//参数:out profile,传地址抛出筛选规则
profile = TrackingProfileManager.createAllProfile("1.2.3.4");
return true; //表示找到所指定的类型对应的筛选规则
}
protected override TrackingProfile GetProfile(Guid workflowInstanceId)
{
//跟据实例查对应的规则
//可用字典集实现
return TrackingProfileManager.createAllProfile("1.2.3.4"); ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -