wf框架编程(Activity有限自动机和wf实例调度)
第二部分续
三、调度运行
1 WF运行时(WorkflowRuntime)
名称空间:System.Workflow.Runtime.WorkflowRuntime
文件:system.workflow.runtime.dll
要点:
1.驻留在CLR中,即CLR要实例化一个WorkflowRuntime对象
2.WorkflowRuntime在宿主中以自已独立的线程运行例(详见wf线程模型部分)
3.WorkflowRuntime可以加载多个工作流实例,每个工作流实例在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是没有持久化的时候,暂时代表内存中的活动。活动执行的推动者是AEC。Runtime不关心每个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实现。会触发WorkflowRuntime的WorkflowTerminated事件。事件参数WorkflowTerminateArgs会包含Exception和WorkflowInstance。跟踪服务也能查询到此Exception。Instance.Complete:触发运行时的WorkflowCompleted事件,WorkflowCompletedEventArgs的OutputParameters是输出参数,根活动的所有公共属性可以通过这个获取。
Instance.Abort:触发运行时的WorkflowAbort事件,最近一次持久化后的工作被丢弃,实例移出内存。
3.4 wf实例状态机和Activity状态机的关系
宿主调度实例的方法,实例进入某种状态,具体变化由Activity自己负责,Activity的状态反过来也影响到实例的状态(比如根活动Unintialize,实例进入Comleted状态)
实例的状态变化和某些行为都可以触发运行时事件。
4活动上下文ActivityExecutionContext
ActivityExecutionContext和ActivityExecutionContextManager
ActivityExecutionContext的作用:
1.提供服务,实现了IServiceProvide接口,可以GetService得到WorkflowRuntime.AddService添加的服务
2.调度状态API,可以和调度器通讯
3.保存状态信息
例如:持久化时候需要保存的上下文(内部执行状态、调度器工作队列状态、事件的订阅信息)
AECManger.CompletExecutionContext -> Activity.OnActivityExeutionContextUnload;
ActivityExecutionContextManage提供了create,complet,Get AEC的能力。