箫同学的原文见http://blog.csdn.net/mrshan/archive/2006/09/05/1181001.aspx
文中所说的情况我举一个我们这开发中的例子看看恰当不恰当:业务都有收费的环节,收费有2种方式——银行托收和前台缴现金,按照文中的描述原来的流程定义是:
<
start-state
name
="start"
>
< transition name ="" to ="chargeinit" />
</ start-state >
< fork name ="chargeinit" >
< transition name ="bank" to ="bank" />
< transition name ="cash" to ="cash" />
</ fork >
< task-node name ="bank" >
< transition name ="bankend" to ="chargeend" />
</ task-node >
< task-node name ="cash" >
< transition name ="cashend" to ="chargeend" />
</ task-node >
< join name ="chargeend" >
< transition to ="end" />
</ join >
< end-state name ="end" />
< transition name ="" to ="chargeinit" />
</ start-state >
< fork name ="chargeinit" >
< transition name ="bank" to ="bank" />
< transition name ="cash" to ="cash" />
</ fork >
< task-node name ="bank" >
< transition name ="bankend" to ="chargeend" />
</ task-node >
< task-node name ="cash" >
< transition name ="cashend" to ="chargeend" />
</ task-node >
< join name ="chargeend" >
< transition to ="end" />
</ join >
< end-state name ="end" />
而我想这种情况其实应该抽象一下,其实都是收费只不过方式不同,如果采用task-node一个节点,用不同的task来表示不同的收费方式,将signal属性设置为first,则只要有一个任务完成了流程就会继续,这应该是jbpm对这种问题的解决办法吧。
<
start-state
name
="start"
>
< transition name ="" to ="charge" />
</ start-state >
< task-node name ="charge" signal ="first" >
< task name ="bank" swimlane ="banker" />
< task name ="cash" swimlane ="casher" />
< transition name ="" to ="end" />
</ task-node >
< end-state name ="end" />
< transition name ="" to ="charge" />
</ start-state >
< task-node name ="charge" signal ="first" >
< task name ="bank" swimlane ="banker" />
< task name ="cash" swimlane ="casher" />
< transition name ="" to ="end" />
</ task-node >
< end-state name ="end" />
经过测试,无论完成哪一个任务bank或cash,流程都会进行下去到达end。
至于另一个任务的后续是否有问题,还没有仔细的分析过,等以后吧。