WF的一些技术细节与应用体会(三)

有关HandleExternalEvent的一些事情。有一个很有趣的现象,是望星观月发现的。情况大体是这样的,当一个工作流设计中含有一个HandleExternalEvent活动时,在其运行到该活动后,如果没有触发一个相关的事件,则该活动会被持久化的。这里使用的持久化是SqlWorkflowPersistenceService作为持久化服务,并且在构造函数中将instanceOwnershipDurationloadingInterval两个参数指定了不为零的值。 但在持久化后,在数据库中的InstanceState表中的ownerIDownedUntil为空值,且nextTimer为永久。

如果我想让HandleExternalEvent的后续活动能够让同一人进行操作,则可能出现问题!这意味着什么?实例没有被锁定,其它的引擎都可以进行加载!这就有可能产生争用问题。此时应在instanceOwnershipDuration参数所指定的时间之内,按道理引擎在持久化工作流时进行锁定。这是微软的疏解还是故意这么设计的?

工作流中的HandleExternalEvent活动是用来接收宿主发出的事件用的。如果执行到此处进行时间限制的持久化,此时HandleExternalEvent只能接收同一个引擎来的事件通知,那么HandleExternalEvent就失去活动了意义。试想一下,我们可以用其它的活动来代替HandleExternalEvent来达到同样的效果。HandleExternalEvent代表的意思是,用户什么时候触发是随机的,不能局限于某一时间内的某一特定的人。也就是说当执行到HandleExternalEvent时前面的活动已经完结,这个完结不是一个一般意义上的某一个活动的完结,他也代表了工作流外某一人或系统某一参与阶段的完结!。说的再白一点就是,我提前完成了任务,于是持久化解锁以让后面的人或系统及时参与。从这个层次上来讲,微软的做法是对的(当然对了,这么关键的东西微软肯定不会搞错!只是我理解的不到位而已)。

看来这只是虚惊一场,但同时也说明了一个问题,我们在应用工作流时,要充分每一个工作流活动的意义,不能只是为了走通工作流而做工作流。

那么如何保证HandleExternalEvent的后续活动能够让同一人进行操作?你有答案了吗?留一个悬念吧,呵呵。

posted on 2007-02-16 08:25  李学斌  阅读(6578)  评论(2编辑  收藏  举报