以国外流行的工做流jbpm4的模式与当今中国开源的ccbpm(ccflow和jflow的总称)流程引擎对照。以便让各位可以了解到中国国情的工做流引擎与国际流行的设计规则的差异、不一样、与优缺点。数据库
1. 顺序流(Sequence)设计模式
JBPM:性能
就是按照流程设计的步骤,一步步的向下运行,这样的模式下每一个节点有前后顺序,就是每一个节点只有一个节点是活动的。spa
例子:好比申请后进行审批,一步一步的进行任务。.net
CCBPM:线程
顺序流,也叫作没有分支的线性流程,流程通常在最后一个节点自动结束,并标识流程完成。也能够经过设置节点条件,自动结束流程。设计
ccbpm的特色是:容许用户本身定义流程完成条件,在任何一个节点运行过程当中,ccbpm都要去检查条件设置,若是知足这个条件流程就自动结束。版本控制
2. 并行分叉(ParallelSplit)日志
JBPM:
流程在某个活动(节点、步骤)以后产生多个分支,而且并行流转。
例子:好比在淘宝买了个商品须要发票,那么卖家就须要一边准备商品发货,一边准备发票邮寄。
CCBPM:
异表单分合流的分流动做,一个动做结束后(分流节点),并行启动多个分支,每一个分支都要向下运动。
在cc中,能够根据方向条件设置来决定是否启用某一个分支。
3. 同步(Synchronization)
JBPM:
在流程中的某个点,多个并行的子流程或者活动,合并成一个流程。流程必须等待全部的分支都执行完成后,才能激活后续活动。
例子:好比商家在收到“发票”和“商品”后,才能确认收货。
CCBPM:
异表单分合流中的合流动做,能够指定必定的完成率,才能到达合流节点。对于未完成的子线程,能够进行删除操做。
4. 独占式选择(Exclusive Choice)
JBPM:
一个活动完成后,只能在后面的多个分支中激活一个。
例子:好比用户下单后,能够有N种付款方式,可是只能选择其中一种。
CCBPM:
具备分支的线性流程。能够由方向条件控制,也能够由用户手动控制。
5. 简单聚合(Simple Merge)
JBPM:
在流程中有2个以上的分支中某一个点处被合并成一个分支,只要分支中的一条完成,便可继续进行,而其余分支自动结束。
例子:好比发货在建设银行和中国银行等支付方式中的一个完成后才被激活。
CCBPM:
便可觉得带有分支的线性流程,又能够是异表单的合流动做。在线性流程中,在某一处选择须要执行的节点并完成执行后,后面的节点一步一步的执行,没有被选择的节点不执行。
在异表单中,能够经过条件设置须要执行的节点,其余节点不执行,在合流点完成汇总并激活。或者,经过设置完成率来激活合流点的操做。
区分究竟是否是分合流,经过查看节点类型。
6. 基本控制流程模式,在JBPM中与CCBPM中的综合实现。
JBPM:
CCBPM:
1. 多重选择(Multiple Choice)
在流程中,当一个活动完成后,有多个分支进行选择,能够选择执行其中的一个或者N个分支。
例子:好比去世博园玩,在门口检票后,能够选择A-E个片区中的N个进行观光。
JBPM中的支持状况:
1.JPDL方式不支持先定义好这里的几种,而后根据条件去筛选其中的几种进行,可是JBPM4.4以后支持一种叫foreach的节点,容许咱们在运行时指定几种特定的任务,好比上面例子中的片区,咱们能够在选定后再去循环。
2.BPMN方式支持根据条件执行多个子分支。
CCBPM中的支持状况:
1.经过定义流程为异表单分合流来实现。
a经过条件控制发起子线程数量。设置方向条件的时候,能够根据须要,选择不通的条件设置,好比:岗位条件、部门条件、表单条件等。
b经过节点树形中设置手工选择方向控制,能够控制发起子线程的发起数量。
2.经过父子流程也能够实现。
2. 同步聚合(Synchronizing Merge)
在流程中的某个聚合点,流程会等待全部的分支到来,才能激活后续的活动。若是分支只有一个,那么就变成简单聚合模式;若是存在2个以上分支,那就是同步模式。
这种模式的关键在于可以动态的根据分支的多少进行聚合。
JBPM中的支持状况:
能够经过设置JBPM的join节点属性multiplicity的值为某个变量,并在程序中动态的修改变量的值来制定分支的数量。
CCBPM中的支持状况:
分合流中合流操做。不管分支有多少,均可以进行汇总,而且能够对汇总的子线程进行删除操做、完成率控制等。
CCBPM的多重选择与同步聚合实例图:
结束为聚合点,中间的为分支。
3. 多重聚合(Multiple Merge)
在流程中的多个分支,均可以激活后续的活动,也就是会产生多个实例。
例子:游客观光完N个片区以后,每一个片区各自的系统能够对游客在本身片区的信息进行存储。
JBPM与CCBPM的支持请参考 同步聚合。
4. 鉴别器(Discriminator)
在流程的某个聚合点,N个分支的第一个分支到达后,就马上激活后续活动;与此同时,流程仍然要等待其他的分支完成并忽略完成。
注意:在其他分支未所有完成前,第一个到达的分支所激活的后续节点是没法执行的。
例子:我的申请提交后,并行提交给第一导师审批、第二导师审批、第三导师审批,他们中只要有一个完成了,那么就能够提交给学院审批。
N-out-of-M鉴别器模式:
跟鉴别器模式同样的,只是这种模式是N个到达后,激活后续节点,而剩下的M-N个节点未完成前,新激活的后续节点同样没法被执行。
JBPM中的支持状况:
没有直接支持这种模式,可是经过自定义节点,应该是能够处理这种模式的。
CCBPM中的支持状况:
有两个属性的控制,能够实现功能,就是上面所说的子线程完成路和子线程删除规则。
第1个:子线程完成率。 该规则能够决定是否可见
第2个:子线程删除规则。该规则决定那些子线程能够被删除以及他们的删除方式。
1. 任意循环(Arbitrary Cycles)
JBPM:
某一个或多个活动能够反复执行。
例子:用户买了瓶汽水,拿到汽水后,中了一瓶,又去兑换了一瓶汽水,若是又中了,再去兑换一瓶汽水….
CCBPM:
彻底是条件判断,在表单中增长一个审核组件,就能够把每次校验的信息,写入里面,完整的显示出来整个轨迹。
2. 隐式终止(Implicit Termination)
JBPM:
指这一个流程中,若是没有活动能够执行,那么流程会自动终止。
例子:好比用户买了汽水,中了50元,可是没有地方能够兑换。
CCBPM:
这种类型属于ccbpm的线性流程的一种,该流程配上流程完成条件,就能够实现该功能。
流程完成条件,就是流程在前进中检查的条件,若是知足该条件,流程就中止运行,该流程实例结束。
1. 无同步的多实例(MIwithout)
在流程中,一个活动能够激活多个实例,每一个实例相互独立,并不须要在后面进行同步。
例子:好比用户购买了N本书,因而后续的支付帐单、更新客户能够以本书为单位各自执行。
JBPM中的支持状况:
支持这种模式,可是不容许在后面进行结束动做。
CCBPM中的支持状况:
分合流与父子流程支持这种模式,分合流上面已经讲过,下面说下父子流程。
第一种状况:发起子流程后,等全部的子流程执行完成后,父流程继续下一步骤或者结束。
第二种状况:发起子流程后,不管子流程是否执行完成,都执行到下一步或者结束。
父流程:
2. 设计时肯定的多实例(MIwith a Priori Design Time Knoledge)
在流程中,被激活的多个实例须要在某个聚合点聚合,而实例的个数在设计的时候就已经知晓率。
JBPM中的支持状况:
对于设计时已经知道实例数量的,最简单的就是使用多个Task节点来实现多个实例。
CCBPM中的支持状况:
合流节点处理各个子线程的任务比率。
完成率 = 子线程上已经完成的数据/全部子线程数量*100%
该节点对于合流节点与分合流节点有效,当子线程的完成率达到该值的时候,该节点的待办才能显示出来,不然该节点的人员不能处理待办。若是合流节点的处理人可以看到待办,他就能够对该流程进行操做,好比:发送、删除、退回、删除子线程等等。
3. 运行时肯定的多实例(MI with a Priori RunTime Knoledge)
在流程中,被激活的多个实例须要在某个聚合点聚合,而实例的个数在设计的时候并不知道,只有在运行时根据条件来决定须要激活多少个实例。
JBPM中的支持状况:
对于运行时能够知晓实例数量的,能够经过设置JOIN节点的multipliclty来实现。
CCBPM中的支持状况:
同表单分合流配合节点访问规则能够实现这个功能。
4. 运行时没法肯定的多个实例(MI without a Priori RunTime Knoledge)
在流程中,被激活的多个实例须要在某个聚合点聚合,而实例的个数在设计的时候并不知道,该模式与上一个模式的区别就是,在产生的实例执行时或者已经执行完时,仍然有新的实例产生。
例子:好比要采购100台电脑,涉及到多个供应商,可是每一个供应商供应多少台电脑是不知道的,所以供应商的数量也是不肯定的,可是每次供应商送货来后,就会将所拥有的电脑数量和所需的100台进行比较,来决定是否要下一个供应商进行供应。
JBPM中的支持:与运行时肯定的多个实例的实现方式同样。
CCBPM中的支持:
这种方式属于ccbpm的父子流程来实现,开始节点启动一个任务,须要采购100台电脑,须要发起n此的选择供应商采购的子流程,每一个子流程完成后,就访问父流程节点信息,进行相关的业务处理(就是是否启动下一个子流程,若是知足100,就不启动子流程了,直接完成父流程的任务,结束主流程.)。
1. 延迟选择(Deferred Choice)
流程中某个点能够有多个分支进行选择。不是基于简单的数据或者决定就能够很明显地做出选择,而是会向系统或者执行环境提供多种可选择的分支;可是又不一样于AND-Split模式,延迟选择只能选择一个分支执行,一旦选择了其中第一个分支,那么其余分支就会被撤销。这种延迟一直会持续到第一个选择分支开始实际运行。
例子:收到的一批商品运送到各个部门,到底选择什么样的运行方式,要看资源的可用性。
CCBPM中的模式:
经过在节点属性—基本属性中,设置手工选择方向条件的方式,能够实现此种模式。实际上ccbpm就是将流程流转的权限在交给了当前节点的操做的人员,由他来决定流程要发送到什么地方去。
2. 交叉存取并行路由(Interleaved Parallel Routing)
或者叫任意顺序流,指几个活动必须按顺序执行,不能同时进行,可是这种顺序又是不定的。
例子:体检的时候有不少项目,这些项目不能同时进行,可是能够以随意顺序进行。
CCBPM中的模式:
这是典型的一种多任务分配流程,使用多维度的分合流能够实现,这个流程的特色是,一个操做人员能够处理三个不一样的任务,这三个任务属于三个子线程,与普通的分合流不一样的是这三个子线程是同一我的处理。在这里就决定了,有一个批次号(项目维度),在这里就是检查项目。
该数据源返回了三个列,分别是:No,Name,BatchNo。 No=操做员编号,Name=操做员名称,BatchNo批次编号。
3. 里程碑(Milestone)
一个活动的激活须要一种具体的状态,好比活动A,B,C,只有在AB都执行完成的状况下才能执行C。
JBPM中的模式:
相似与顺序模式或者同步模式。
CCBPM中的模式:
这个可能相似与ccbpm的延续流程,当一个流程长度很大的时候,须要跨度不少年实施的时候,把该流程截成一段段的,分开设计,一条流程,是上一条流程的延续。
延续流程是父子流程的一种,可是延续流程只有一个段接一段,就是一个父流程有多个子流程,可是延续流程就只能有一个子流程。
1. 取消模式(Cancel Activity)
就是将某个活动取消。
CCBPM中,相似与删除流程操做相同。
不能删除:不容许删除。
逻辑删除:仅仅将此流程标记为删除状态,数据仍然存在节点表单与流程报表中。
记录日志方式删除:删除节点表单、流程报表数据,并记录备案。
完全删除:完全清除该流程的全部数据,包括该工做实例的节点表单数据、流程报表数据、轨迹数据、退回、移交操做信息。
让用户决定删除方式:显示对话框,让用户选择删除方式。
2. 取消实例(CancelCase)
若是一个活动产生了多个实例,那么仅仅撤销这个活动是不够的,要将他所引发的全部实例都移除才行。
CCBPM中的解决方案,参考 取消模式。
共同点:
1. 嵌入式的工做流引擎,下降集群复杂性。
2. 严格而灵活的流程版本控制
3. 支持多种数据库
4. 支持多种流程设计模式
5. 成熟度高的开源工做流,具备可靠的稳定性和性能。
区别:
1. 流程定义方式:
JBPM:采用xml的方式,经过拼字符串的方式完成,因此流程定义时的结果不直观、不方便。
CCBPM:拥有本身的流程设计器和表单设计器,画布性质的,所见即所得。包括流程运转条件、方向条件等。
2. 面向使用对象:
JBPM:因为设计方式,只能面向流程开发人员。
CCBPM:既面向流程开发人员又面向业务人员,即便不会编程,也能够进行流程设计。
3. 节点类型:
JBPM:开始节点、结束节点、自动节点、任务节点、fork分支、join联合等多种节点。经过多种节点的配合以及事件等使用,组成流程。
而且,开始节点必须有一个向外的流向。
CCBPM:普通节点、分流节点、子线程节点、合流节点。
开始节点属于普通节点,能够作为一个单节点的流程,没有流向。
结束节点由CC自动判判定义。
CC中的循环是经过方向条件判断,同步、聚合等是由合流节点。
4. 对复杂流程的支持:
JBPM:不适合很是复杂的流程,他只是提供了一套丰富的工做流模型,可让你去作任何事情,即使违反工做流规范。
CCBPM:经过节点运行规则、方向条件、丰富的事件、运行模式和表单解决方案,彻底知足复杂的流程运转,对任何状况,都是可控的。
5. 对历史数据的挖掘:
JBPM:对历史数据的支持不是很好,好比,子任务不能写入历史之类。固然,经过修改代码与BUG,也是能够实现的。
CCBPM:具备轨迹功能,即对某一个流程运行产生数据的保存,流程运行中,能够查看相关节点的处理信息与流程数据,流程结束后也能够。