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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值