zoukankan      html  css  js  c++  java
  • wf框架编程(Activity有限自动机和wf实例调度)

     

    第二部分续

    三、调度运行

    1 WF运行时(WorkflowRuntime)

    名称空间:System.Workflow.Runtime.WorkflowRuntime

    文件:system.workflow.runtime.dll

    要点:

    1.驻留在CLR中,即CLR要实例化一个WorkflowRuntime对象

    2WorkflowRuntime在宿主中以自已独立的线程运行例(详见wf线程模型部分)

    3WorkflowRuntime可以加载多个工作流实例,每个工作流实例在WorkflowRuntime有独立的线程

    4.同一宿主可以实例化多个WorkflowRuntime,他们可以同时工作

           带来的问题,wf加载部分要加锁。会对wf程序队列产生影响。

    是服务容器,可以加入定义服务,wf运行时服务和向Activity提供的服务

    具体推荐大家可以看看WXWinter的博客,他整理的资料很全也很好
    http://www.cnblogs.com/foundation/articles/527854.html

    2活动的有限自动机

    2.1 Acitivity和CompositeAcitivity结构分析


        详细内容可以看WXWinter的博客,vs里面看看msdn帮助也是推荐的好方法

    2.2 Acitivity自动机

           可以理解为Acitivity的生命周期


    图片来源:Essential.Windows.Workflow.Foundation
     有些资料上:Suceeded画为Closed

    2.3 调度器队列

           Wf调度器的工作队列,是非抢占模式。

    2.4 Wf程序队列

           宿主和wf的通信通道

    图片来源:Essential.Windows.Workflow.Foundation
     

    3 WF的调度

    3.1 Wf的逻辑生命周期


                                参考Essential.Windows.Workflow

    wf的逻辑生命周期不是ClR对象的生命周期,CLR是没有持久化的时候,暂时代表内存中的活动。活动执行的推动者是AECRuntime不关心每个Activity的状态。

    3.2 Acitivity生命周期和WF实例逻辑生命周期的关系

    图片来源:Essential.Windows.Workflow.Foundation

          Activity的生命周期:Initialize,Exeute,ContinueAt,OnClose,Uninitialize

    重要:WF不关心下一个Acitivity时什么,以及何时流转

    3.3 WF实例的生命周期

     

    图片来源:Essential.Windows.Workflow.Foundation

    实例创建

           使用CodeDom或者直接激活的方式得到wf program prototype(可以理解为实例模板),再得到多个实例,实例元数据指向原型元数据。如果缓存中存在原型,直接创建,不存在就加入缓存。创建实例后要建立调度器,实例对象要绑定到调度器及AEC上。启动实例(star),就是在调度器工作队列中加入根节点的Exeute方法。

           加载器实现


    WorkflowLoaderService的子类,可以自定义加载服务实现加载其它DSL定义的流程。

    实例钝化

           是持久化保存和销毁(Workflow.Unload)的合并过程,这里只需要知道概念。详细过程参考:WF持久化部分。

    实例暂停:

    Instance.Suspend(string Error)或者SuspendActivity实现。暂停wf实例执行,实例仍会驻留在内存中,如果需要从内存卸载需要显式调用WorkflowInstance.Unload()方法。

    Suspend后的实例,即使调度器队列中存在工作项,也并不执行。必须显式调用WorkflowInstance.Resume()后实例才能恢复执行。

    挂起的相关信息可以通过Error属性传入,通过WorkflowSuspendEventArgs.Error属性。

    实例中止:

    Instance.Terminate(string Error)Terminate Activity实现。会触发WorkflowRuntimeWorkflowTerminated事件。事件参数WorkflowTerminateArgs会包含ExceptionWorkflowInstance。跟踪服务也能查询到此ExceptionInstance.Complete:触发运行时的WorkflowCompleted事件,WorkflowCompletedEventArgsOutputParameters是输出参数,根活动的所有公共属性可以通过这个获取。

    Instance.Abort:触发运行时的WorkflowAbort事件,最近一次持久化后的工作被丢弃,实例移出内存。

    3.4 wf实例状态机和Activity状态机的关系

           宿主调度实例的方法,实例进入某种状态,具体变化由Activity自己负责,Activity的状态反过来也影响到实例的状态(比如根活动Unintialize,实例进入Comleted状态)

    实例的状态变化和某些行为都可以触发运行时事件。

    4活动上下文ActivityExecutionContext

    ActivityExecutionContextActivityExecutionContextManager


    ActivityExecutionContext的作用:

    1.提供服务,实现了IServiceProvide接口,可以GetService得到WorkflowRuntime.AddService添加的服务

    2.调度状态API,可以和调度器通讯

    3.保存状态信息

    例如:持久化时候需要保存的上下文(内部执行状态、调度器工作队列状态、事件的订阅信息)

    AECManger.CompletExecutionContext -> Activity.OnActivityExeutionContextUnload;


    ActivityExecutionContextManage提供了create,complet,Get AEC的能力。


  • 相关阅读:
    参数_门店
    实现百分比和百分比的累加以及A、B、C类别的标识
    参数范围的选择
    栏目数据合并表达式
    父子维度转化为组
    从参数中获得特定字符串
    多参与多轴
    数据库链接字符串大集合
    闰年2月29天
    sum函数按照类别的值进行取值
  • 原文地址:https://www.cnblogs.com/lodestar/p/1132929.html
Copyright © 2011-2022 走看看