WF持久化机制剖析
1 为什么要持久化状态?
1.1 内存是有限的,将等待或者休眠的流程暂时从内存中卸载有利于提供性能
1.2 运行时可能会出现不稳定因素导致流程崩溃,持久化可以提供流程恢复的可能
1.3 流程中的事务或者补偿机制需要隔离的流程状态来辅助完成
2 什么时候会发生流程被持久化?
2.1 在流程中加入的活动被标有PersistOnClose属性,这是人为设定的强制持久化策略, 即流程执行到该步骤必须要保存一下,不表示从内从中卸载。
2.2 活动的运行时状态被设置为Executing时(即运行中)(如果DelayActivity),下一个活动必须在将来的某个时候到达, 这时引擎会决定使流程进行持久化。
2.3 当在流程实例之外手动调用卸载流程的方法时会导致持久化
2.4 当具有补偿特性的活动(如CompensatableSequenceActivity)被创建多于一个执行上下文时会发生持久化(请原谅这话说的有点专业,因为解释它需要费长篇大论)
3 什么时候会发生流程被反持久化?
流程被保存后是不具有自我激活的功能的,必须通过外部方法去激活它。
3.1 当调用引擎的获取一个工作流实例的方法时, 如果实例不在内存中,引擎会自动向已注册的持久化服务发出装载其状态的指令
4 什么是流程阻塞态?
4.1 在流程执行过程中,当遇到例如Delay这样的活动时,流程被指示进入休眠状态(钝化),即被挂起, 此时流程根活动被标记为阻塞态,引擎发出持久化指令。
4.2 什么时候出现非阻塞态持久化化行为?
4.2.1 手动调用持久化或者设置持久化点(PersistOnCloseAttribute)的时候
5 什么是流程锁定态?
5.1 当流程执行从事务范围(TransacationScope)退出或结束了一个具有持久点标记的活动时, 引擎自动持久化该流程状态,此时流程被标记为锁定态,即独占的。
5.2 为什么需要这个状态?
5.2.1 因为流程实例有可能被多个HOST加载,如果没有这个状态表示, 当出现上述情况时,使开发者可以根据自己的设计要求去做排他操作,这样流程状态会发生紊乱,或破坏局部流程的原子操作。
6 如何唤醒流程?
6.1 流程被持久化以后就变成了数据,而不具有任何行为,所以它不具有自我唤醒的功能
6.2 流程可以通过定时器轮询唤醒
6.3 当要获取指定的流程实例而该流程不在内存中时,流程会引擎唤醒
6.4 可以通过从流程的根活动获取下一个执行周期的时间点,并定时唤醒该流程
7 流程与消息队列
7.1 流程是怎么被驱动的?
7.1.1 流程是依靠引擎自带的执行计划服务驱动的
7.2 执行计划中的计划项是依靠什么实现的?
7.2.1 依靠引擎自带的消息队列服务完成的
7.3 为什么消息队列服务只能从活动的执行上下文(AEC)中获得?
7.3.1 因为消息队列服务不同于其它服务,它是负责驱动流程往下走的机制之一,它必须和流程绑定。 当流程被持久化后必须携带消息队列服务的全部信息。否则,当出现Runtime Host更换时,流程不能被正常驱动,这样就失去了流程持久化的意义,也完成不了群集HOST的需求。