正文

WF持久化机制剖析2007-11-23 09:26:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/Csharpsky/31109.html

分享到:

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的需求。

阅读(4820) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册