认识并行任务
在流程引擎开发中,稍微复杂一点的项目都会遇到并行任务!什么是并行任务呢?就是在完成一个流程节点后,下一步会同时开始多个任务,且任务与任务之间互不影响。
这个说起来真的有点绕,刚开始我真不理解,试了好多次才想明白,下面就画2条不同的流程图一起理解。
![](https://i-blog.csdnimg.cn/blog_migrate/98c5095b94abf044d6f4eee48b379ce1.png)
比如像上面的报销流程图中,在申请人发起申请后,执行【自动知会】节点后,会同时产生 【人事审批】节点任务和【行政审批】节点任务,这2个任务之间互不影响(谁先完成谁后完成都没关系),只有这2个节点的任务都成功执行了,才会到达【经理审批】节点。
像这样同时产生了2条并行的分支任务就是并行任务。
那还有没有其它事情呢?还真有,看下面的情况:
![](https://i-blog.csdnimg.cn/blog_migrate/1b8147355545e3ef546b0d794587eba2.png)
上面的流程图,在【评估纠正预防措施】节点,产生了2条需要评估纠正预防措施,就会同时产生2条【跟踪验证】的子流程,在2条子流程都执行完了,整个大流程才算走完。
通过上面的2个流程图实例,相信大家对并行任务有了理解。
通过上面的图,大家也一定看出来了实现并行任务的2种方式:
1)网关
2)子流程
确实是这样的,目前我在做流程开发,所能想到的也就只有这2种方式,如果你还有其它的方式,请留言。
网关
我在实际项目中,我是怎样使用【网关】来实现并行任务的,首先还是画流程图,并配制流程图
![](https://i-blog.csdnimg.cn/blog_migrate/fc6ceb17d5d449bb5bc7239cb38df135.png)
上面的流程图很好画,主要是配制任务执行人参数。就是图中的红色边框。
在流程中,所有 User Task 类型的节点产生的任务都是要指定人的。
![](https://i-blog.csdnimg.cn/blog_migrate/ca9a27b4f845c9989ffef5640eba1b74.png)
在此流程中,下一个节点是自动任务节点,所以在【申请人】节点我就通过传递参数的方式指定了【人事审批】和【行政审批】的执行人。即使以后公司在人事或者行政的人事变动,需要不同的人来审批,都不需要调整流程。程序仍然可用。
子流程
上面的网关能完成一定情况的并行任务,但并不能应对所有的实际业务场景。于是嵌套多实例的子流程的情况就产生了。
![](https://i-blog.csdnimg.cn/blog_migrate/fbe495e804a0bfae6ae666981761015b.png)
相信大家对左边的子流程框肯定都理解。我就主要说下另边红色小框表示什么:
竖起的三根线:表示任务并行,任务同时开始,相互之间不影响
横起的三根线:表示任务串行,任务按顺序执行,也就是如果要产生3个任务,就是第1个任务完成了,才会产生第二个,第二个完成,产生第三个任务
![](https://i-blog.csdnimg.cn/blog_migrate/8bbe2f4001b2a94a13871b574c501373.png)
参数:
Collection: userIdList ( 多个执行人,以数组的方式传递 )
Element Variable: userId
Completion Condition: (配制完成条件,我这里是需要3个都完成)
nrOfCompletedInstances : 完成的实例(流程引擎自带的参数名,固定的不能更改)
nrOfInstances :总共实例(流程引擎自带的参数名,固定的不能更改)
条件可以配制成大于 ${nrOfCompletedInstances/nrOfInstances > 0.3}、小于 ${nrOfCompletedInstances/nrOfInstances < 0.8},根据项目的实际情况来
![](https://i-blog.csdnimg.cn/blog_migrate/0233c7a82dcfce46b5ed0ed1e39502ca.png)