但后来却一直没有专门写文档去更改,上个月,终于决定在《工作流之星光》系列中进行更改了,不打算专门写文档改正这些错误(估计会在明年3月份再写了)。—— 而这一年来,也在盼着有人能够指明其中的错误(哈哈,我竟然在盼着错误)。
正好一年一个月过去了,总算有位 haidlz兄弟给指出一些错误了,真的让人高兴。盼了一年,总算盼到了。
当然也为这篇文档(《工作流模型分析 v1.1》)中的一些错误,并且长时间没有改正这些错误,而对大家说声抱歉。
haidlz最初是在wfchina上指出,摘抄如下:
http://www.wfchina.org/mvnforum/viewthread?thread=222
你好银狐
今天下午看你网上介绍的工作流模式连接的英文文章,为了更好理解有些术语,又找到你的工作流模型分析,我一边查着字典翻译
原文,一边拜读你的文章,下面是我对你文章的不同理解:
3.2. 多起点
虽然你列举了三类多起点流程情况,画出了相应的流程图并作了简单分析,但是你都没有举具体的例子,缺乏说服力。
我认为,你所说的情况,都可归结到单起点,或者你将这几种情况都举一个具体的例子,我想我应该可以用单起点来解释。
在没有实际例子时,理论上,你所说的多起点1
. |---------|
. | Start A |\
. |---------| \ |---------| |--------|
. \| Task A |---->| Task B |
. /|_________| |--------|
. |---------| /
. | Start B |/
. |---------|
在语义上可以归入:
. |---------|
. /------>| Pre A |\
. |---------|/ |---------| \ |---------| |--------|
. | Start | Xor Split Xor Join \| Task A |---->| Task B |
. |_________|\ /|_________| |--------|
. \ |---------| /
. \----->| Pre B |/
. |---------|
一个模型,我认为语义越少越简单越好,使用最原子的语义(最多加上很常用的少数复合语义,条件或分支加上或连接可以组合成
一个循环语义,如果需要,也可以将循环作为一个实现)
我的理论不高,上述用语义还是模式,就这个意思吧:d
多起点之二,正如你文中所说,其实完全可以用子流程来解释这个问题,而没必要用多起点来解释。
多起点之三,仍然可以用子流程来解释。
文中“但是未必是从流程B 的默认激活点激活,可能是从流程B 的中途某个任务激活”,这句话有问题,如果流程可以从中途激活,
那么,你所谓的中途,就应该是一个流程的起点。或许这个流程同时可以作为其他流程的子流程,但你分析这个流程,不应该将其放在
调用它的流程中(将一个可以单独运行的子流程展开到调用流程,将其作为大流程中的一段,这样看的话,所有可以单独运行的子流程
都会符合你的“多起点三”了)。
总之,多起点之一,可以看作:没有从流程整体看,而是将一个流程片断当作一个流程而造成的;
多起点之二、三,可以看作:分析一个可以单独运行的子流程,没有将其作为一个整体,而是将其作为子流程铺开到调用流程时,
来分析其单独运行的情况。
或者,你用三个具体的例子,我们在例子上探讨,或许更有说服力。
第四章 流程激活模型
4.2 定时或时限激活
定时激活一个流程,其实,只能说是定时激活一个子流程。我想不出不是子流程的情况而定时激活的。而定时激活一个子流程,
跟定时激活一个活动(或任务)在模型定义与实现上没什么区别。
至于时限激活,肯定更是一个流程中的活动(或子流程)了。
因为没什么实践,凭想象,凡是靠时间时限、消息激活的,都是子流程。而主流程必定只能通过手工方式激活。
5.1.2 自循环
我觉得你的例子举的不合适:多处长审批。多处长审批归结到多实例是否更合适呢?
5.2.1. 并行
原文:并行(Parallel),在有的某型中叫“And 模式”
更确切来说,应该是:And Split(与分支)模式
5.2.2.--5.2.3. 异或模式 显示与隐式
记得原来看Petri网的概念是这样的:
. |---|
. /->| A |-->
. / |---|
. ⊙<
. \ |---|
. \->| B |-->
. |---|
隐式异或分支,好像是无条件的,前面节点不关心哪个后续分支激活,而只是将token放入多个分支变迁(如图中A、B)
前的公用库所,而变迁A、B到底哪个激活,是看A、B两个变迁(非Petri网的叫法应该是活动或任务)在前条件都为真时,哪
个先取token(或哪个先激活)。
而显示异或分支,则分支到哪条路由,取决于分支前的节点(按条件)。
5.2.4. 鉴别模式
很明显,你理解错误了,并且偏差很大:
你的原文:
{鉴别模型,在标准的Workflow Patterns 表述中,又叫Discriminator Choice。这同前面的“独占式选择”很相似,
唯一不同点,就是多了一个鉴别器(Discriminator)。当任务达到这个鉴别器的时候,鉴别器会根据当前流程所处的状态,
对比预先设定的一些选择规则,自动判别接下来流程的流向,也就是自动根据条件,选择一个满足条件的分支运行。
鉴别器模式(有的可能叫选择器等等名字,表达的意思基本相同),在现实应用中较为广泛。比如在订单申请流程中,
设定一个依据数额判别流向的鉴别器,如果数额大于等于5000,就走分支流程A,如果数额小于5000 就走分支流程B。
}
下面是我整理及翻译的英文Workflow Patterns的表述(汉语部分是我自己翻译的,英文水平太差,肯定有错误的:d):
{
9. Discriminator 鉴别模式
9.1. Description 描述
The discriminator is a point in a workflow process that waits for one of the incoming branches to complete before
activating the subsequent activity. From that moment on it waits for all remaining branches to complete and "ignores"
them. Once all incoming branches have been triggered, it resets itself so that it can be triggered again (which is
important otherwise it could not really be used in the context of a loop).
鉴别模式是在工作流过程某点,等待前面任意一个分支完成后,即激活后续活动,此时,所有其他其前面分支将被忽略。一旦所有
进入分支都完成,它将重置自身,以便能进行下一次触发(这种情况不能用于循环上下文?)
9.2. Examples 事例
To improve query response time, a complex search is sent to two different databases over the Internet. The first one
that comes up with the result should proceed the flow. The second result is ignored.
为了改善查询响应时间,一个复杂的搜索通过互联网同时发送到两个不同的数据库,第一个将返回结果后,将继续后续的活动,另一个
(未返回的查询)将忽略。
}
在实现上,英文资料里说的是,绝大多数工作流引擎没有直接实现鉴别器。
标准鉴别模式,是多个Incoming branches,一个Outgoing branch.
另外,Workflow Patterns 中除了模式9的 Discriminator,还有一个模式9a [N-out-of-M-join],这种情况跟模式9类似,不同处是,
模式9是多个 Incoming branches 中任何一个先到,当前节点即激活,而 [N-out-of-M-join] 是,共 M 个 Incoming branches 中,仅
当有 N(N<m) p="" 个完成时,才激活本节点。<="">
关于模式9的例子,上述已经有了,而模式 9a [N-out-of-M-join] 的例子,不知道下面的例子是否合适:
根据当前组织机构中满足某种表决权限的,为每个人生成一个表决活动实例,当51%的人表决同意后,即认为通过,而后续表决的将
忽略。
时间很快,一晃就已经1点了,明天还要上班,今晚就到这里吧。
我来你们论坛时间不长,对工作流,以前大致看过本范玉顺的书,之后也就是因兴趣自己琢磨一下,到最近才正式看了本英文的 XPDL
规范。我打算在明年自己写一个工作流方面的东西,这几天才在网上找到你们的论坛。总之,我是刚进门者,很多方面相当弱智,如中国
工作流论坛中有一个好像是 obe 板块,就不知道是什么意思,汗:d 想向大家请教一些很基本的知识,如工作流常用英文缩写释义,没人
理:(。
文中不同意见的地方,别怪我刻薄,我想很多问题自己琢磨不容易弄清楚,特别是中国软件界现状,一般来说,英文好的,能比较顺利
读英文原著的,开发经验大多不行;而开发功底深厚的,常常英文水平不够。我们只好多讨论甚至争吵,以加深对理论的理解。