zoukankan      html  css  js  c++  java
  • 自定义Tracking


    开张那天就被Teddy's Knowledge Base与TerryLee 两位说没条理,不认真,
    看了两位的家,真的不错,其实我没搬家前了不错,(是朋友帮整理的(^_^))

    从小条理性就不强,上学时写作文总跑题,现在写文章也喜欢乱侃,这不,说"用WF开发大富翁..."又被ccBoy笑话了。还好,各位老大没看见我超级恶搞的技术文章,否则.......各位老大一定吐血

    有些懒,不准备写[自定义Tracking],想打个哈哈就过去,没想到让ccBoy揭穿了,看人家的留言都比我的内容多,真不好意思。

    用ccBoy为开头,将[自定义Tracking]补上吧
    --------------------Begin 引用(ccBoy)--------------
    WF中Tracking 是非常有用的,你可以想想WF的工作流引擎是个黑箱子,所有有关工作流实例运行的情况或事件只有WF引擎知道,Hosting如果想知道,那么需要一个查询的界面。Tracking就是这个查询界面,一套API模型,在WF工作流引擎内部有一个Listener监听查询请求,Tracking Profile就是查询的SQL语句,而Tracking Provider只是放查询结果的地方,可以在数据库中也可以在内存或文本中,至于你说的什么触发器这个恐怕太生硬了:) 特别是人机交互(以前的HWS场景)和状态机方式的灵活跳转的工作流场景中,比如查询任务的执行情况,或是某种状态和事件下要怎样,Tracking 是最好帮手,WF把这部分的定制留给了开发人员自己控制了,它只做内核,它的增强版本表现形式就是Biztalk Server的BAM模块,WF的设计更正了Biztalk Server 中HWS的不足,但开发上,从Beta2之后它将Tracking功能的定制放到SDK中了
    ---------------------End 引用---------------------

    对于ccBoy的说明,我画了一个图



    自写义tracking服务,需要实现TrackingChannel TrackingServic这两个类

    实现TrackingChannel (今天是单号,我用C#写)

    public class Tracking通道 : TrackingChannel
        
    {
            
    private TrackingParameters 被跟踪的实例 = null;

            
    //构造-2
            protected Tracking通道()
            
    {}
          
            
    //构造-2
            public Tracking通道(TrackingParameters parameters)
            
    {
                
    //该参数将得到TrackingParameters
                
    //有被跟踪的实例的信息(很多)

                
    this.被跟踪的实例 = parameters;
            }


            
    //override
            
    //Tracking runtime调用该方将实例完成的信息向外界抛
            protected override void InstanceCompletedOrTerminated()
            
    {
                Console.WriteLine();
                Console.WriteLine(
    "-------------------------------------");
                Console.WriteLine(
    "实例已完成或终止");
                Console.WriteLine(
    "实例:" + 被跟踪的实例.InstanceId.ToString());
                Console.WriteLine(
    "实例为:" + 被跟踪的实例.WorkflowType.AssemblyQualifiedName);
                Console.WriteLine(
    "-------------------------------------");
                Console.WriteLine();
            }


            
    //override
            
    //Tracking runtime调用该方法发送将监视到的各类tracking records向外界抛出
            protected override void Send(TrackingRecord record)
            
    {
                
    // 对类型进行一下对象筛选,然后再跟据不同的对象进行不同的输出

                
    //筛选实例
                if (record is WorkflowTrackingRecord)
                
    {
                    WorkflowTrackingRecord obj1 
    = (WorkflowTrackingRecord)record;

                    Console.WriteLine();
                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine(
    "实例记录");
                    Console.WriteLine(
    "实例:" + 被跟踪的实例.InstanceId.ToString());
                    Console.WriteLine(
    "时间: " + obj1.EventDateTime.ToString());
                    Console.WriteLine(
    "实例状态: " + obj1.TrackingWorkflowEvent.ToString());
                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine();
                }

                
                
    //筛选结点
                if (record is ActivityTrackingRecord)
                
    {
                    ActivityTrackingRecord obj2 
    = (ActivityTrackingRecord)record;

                    Console.WriteLine();
                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine(
    "Activity记录");
                    Console.WriteLine(
    "实例:" + 被跟踪的实例.InstanceId.ToString());
                    Console.WriteLine(
    "时间: " + obj2.EventDateTime.ToString());
                    Console.WriteLine(
    "Activity名子: " + obj2.QualifiedName.ToString());
                    Console.WriteLine(
    "Activity类型: " + obj2.ActivityType);
                    Console.WriteLine(
    "信息: " + obj2.ExecutionStatus.ToString());
                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine();
                }

                
                
    //筛选业务状态点(用户状态点)
                if (record is UserTrackingRecord)
                
    {
                    UserTrackingRecord obj3
    = (UserTrackingRecord)record;

                    Console.WriteLine();
                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine(
    "用户状态点");
                    Console.WriteLine(
    "实例:" + 被跟踪的实例.InstanceId.ToString());
                    Console.WriteLine(
    "时间: " + obj3.EventDateTime.ToString());
                    Console.WriteLine(
    "产生该记录点所在的Activity: " + obj3.QualifiedName.ToString());          
                    Console.WriteLine(
    "所在Activity的类型: " + obj3.ActivityType.FullName.ToString());         
                    Console.WriteLine(
    "信息: " + obj3.UserData.ToString());

                    
    //筛选业务状态点(用户状态点)中的规则
                    if (obj3.UserData is System.Workflow.Activities.Rules.RuleActionTrackingEvent)
                    
    {   RuleActionTrackingEvent obj3_rule = (RuleActionTrackingEvent)obj3.UserData;
                        Console.WriteLine(
    "这是一个用户状态点的规则");
                        Console.WriteLine(
    "规则名: " + obj3_rule.RuleName.ToString());
                        Console.WriteLine(
    "规则状态: " + obj3_rule.ConditionResult.ToString());

                        
    //Policy绑定的规则集中的每个规则都会发送一组状态,Policy有点像职责链,具体以后讲
                        
    //Policy规则是自动将信息抛出的,但在类型上算上用户状态
                    }

                    Console.WriteLine(
    "-------------------------------------");
                    Console.WriteLine();
                }

            }

        }

    实现TrackingServic(我把筛选也写在类里了)

    public class 自定义跟踪服务 : TrackingService
        
    {
            
    protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile)
            
    {
                
    //引擎通过该方法加载监视方案
                
    //可在该方法内为工作流模板与对应的筛选建一字典集合,
                
    //该演示设计成所有工作流都使用同一筛选规则方式

                
    //参数:workflowType,传入的类型,用于在字典集合中查找对应的筛选规则
                
    //参数:out profile,传地址抛出筛选规则
     
                profile 
    = 生成一个Profile();
                
    return true//表示找到所指定的类型对应的筛选规则
            }

        
            
    protected override TrackingProfile GetProfile(Guid workflowInstanceId)
            
    {
                
    //跟据实例查对应的规则
                
    //可用字典集实现
                return 生成一个Profile();
            }


            
    protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId)
            
    {
                
    //返回指定工作流模板的指定版本号的筛选规则
                
    //参数:profileVersionId,版本号
                
    //可用字典集实现
                return 生成一个Profile();
            }


            
    protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile)
            
    {
                
    //重载指定工作流模板的筛选规则
                
    //参数:workflowType.,
                
    //参数:workflowInstanceId,
                
    //参数:out  profile,
               
                profile 
    = null;
                
    return false;  
            }


            
    protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters)
            
    {
                
    //用TrackingParameters参数初始化信道
                return new Tracking通道(parameters);
            }



            
    // 建立自定义的TrackingProfile  关于自定义TrackingProfile 见相关
            private static TrackingProfile 生成一个Profile()
            
    {//一个全监视的profile
                TrackingProfile profile = new TrackingProfile();
                profile.Version 
    = new Version("4.3.2.1");
                ActivityTrackPoint 结点跟踪点对象
    = new ActivityTrackPoint();
                ActivityTrackingLocation location 
    = new ActivityTrackingLocation(typeof(Activity));
                location.MatchDerivedTypes 
    = true;
                
    foreach (ActivityExecutionStatus s in Enum.GetValues(typeof(ActivityExecutionStatus)))
                
    { location.ExecutionStatusEvents.Add(s); }
                结点跟踪点对象.MatchingLocations.Add(location);
                profile.ActivityTrackPoints.Add(结点跟踪点对象);
                UserTrackPoint 用户跟踪点对象
    = new UserTrackPoint();
                UserTrackingLocation UserTrackingLocation标记
    = new UserTrackingLocation();
                UserTrackingLocation标记.ActivityType 
    = typeof(Activity);
                UserTrackingLocation标记.ArgumentType 
    = typeof(object);
                UserTrackingLocation标记.MatchDerivedArgumentTypes 
    = true;
                UserTrackingLocation标记.MatchDerivedActivityTypes 
    = true;
                用户跟踪点对象.MatchingLocations.Add(UserTrackingLocation标记);
                profile.UserTrackPoints.Add(用户跟踪点对象);
                WorkflowTrackPoint 实例跟踪点对象
    = new WorkflowTrackPoint();
                实例跟踪点对象.MatchingLocation 
    = new WorkflowTrackingLocation();
                
    foreach (TrackingWorkflowEvent workflowEvent in Enum.GetValues(typeof(TrackingWorkflowEvent)))
                
    { 实例跟踪点对象.MatchingLocation.Events.Add(workflowEvent); }
                profile.WorkflowTrackPoints.Add(实例跟踪点对象);
                
    return profile;
     }

     }








     

  • 相关阅读:
    1.惨不忍睹凌乱的定时任务
    二维码名片
    给定的逗号分隔的数字字符串转换为Table
    sql 列集合转换成逗号分隔的字符类型
    linq 分组
    触发器
    整合思路、步骤
    整合注意事项
    配置文件
    Struts2的线程安全性
  • 原文地址:https://www.cnblogs.com/foundation/p/518807.html
Copyright © 2011-2022 走看看