⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wxdtrackingservice.cs

📁 博客园WxWinter写的WF工作流入门学习资料及示例代码
💻 CS
📖 第 1 页 / 共 2 页
字号:
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 + -