jbpm学习六

5.fork/join节点(分支/聚合)

该节点主要解决流程并发问题,Fork代表分支,将一个流程分成若干个子流程,Join是将多个分支合并到一起,在继续执行。

注:fork和join必须同时使用

来看下面一个demo:


<?xml version="1.0" encoding="UTF-8"?>

<process name="demo5_forkjoin" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="278,18,48,48">
      <transition name="to 进行购物" to="进行购物" g="-69,-22"/>
   </start>
   <end name="end1" g="282,312,48,48"/>
   <task name="进行购物" g="259,87,92,52">
      <transition name="to fork1" to="fork1" g="-52,-22"/>
   </task>
   <fork name="fork1" g="286,161,48,48">
      <transition name="to 发货" to="发货" g="-45,-22"/>
      <transition name="to 收钱" to="收钱" g="-45,-22"/>
   </fork>
   <join name="join1" g="283,244,48,48">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </join>
   <task name="发货" g="125,205,92,52">
      <transition name="to join1" to="join1" g="-49,-22"/>
   </task>
   <task name="收钱" g="430,218,92,52">
      <transition name="to join1" to="join1" g="-49,-22"/>
   </task>
</process>
以上流程图和该流程图对应的xml配置文件,反映了一个网购最简单的流程,就是网上下单后,可以选择货到付款或者先付款再发货,只要完成了‘发货’和‘收钱’两个任务即可结束

该流程,无所谓谁先谁后,这就用到了fork和join节点。

注:虽然图中fork和join节点都是一样的图标,但这俩真心不是一个节点啊

下面说说具体流程数据库中表的变化

(1)工作流程发布,启动都不必我多说,启动后,jbpm4_task表中数据如下:


(2)执行下面代码完成第一步‘进行购物’(工作流程启动后就在这步)

@Test
<span style="white-space:pre">	</span>public void demo3(){
	<span style="white-space:pre">	</span>TaskService taskService = new Configuration().getProcessEngine().getTaskService();
		taskService.completeTask("10002");
	}
此时jbpm4_task表中数据如下:


jbpm4_execution表中数据如下:


可以清楚的看到,此时jbpm4_task任务表中有两个任务,jbpm4_execution流程实例表中有3个实例,20001和20002是子实例,这是怎么看出来的呢,jbpm4_execution有一个字段

parent,第一条记录是null,第二条和第三条的parent都记录10001,懂了吧!

(3)接下来执行下面代码:

<span style="white-space:pre">	</span>@Test
	public void demo3(){
		TaskService taskService = new Configuration().getProcessEngine().getTaskService();
		taskService.completeTask("20003");
	}
也就是说,执行'发货'任务,jbpm4_task数据如下:


jbpm4_execution表数据如下:


可以清楚地看到,jbpm4_task表中‘发货’任务已经不存在了,因为该任务已经执行结束。

再来看jbpm4_exection表,ACTIVITYNAME字段,‘发货’的流程实例的ACTIVITYNAME字段变为了'join1',说明在等待其他fork子流程的结束(这里只剩一个‘收钱’没执行了)。

(4)接着执行下面代码:

<span style="white-space:pre">	</span>@Test
	public void demo3(){
		TaskService taskService = new Configuration().getProcessEngine().getTaskService();
		taskService.completeTask("20005");
	}
‘收钱’任务也执行结束了,jbpm4_task表中不存在任何关于该任务的数据了(按照我现在的表来看,就是空的),

jbpm4_execution表中也没有任何数据了。


注:该流程结束,虽然过程中jbpm4_execution流程实例表中存在过3条此流程记录,但因为其他两条是子流程,所以该流程结束后,jbpm4_hist_procinst流程实例历史表中只有一条记录,如下图所示:


那么问题来了,流程实例历史表中查不到子流程信息,那上哪去查呢?jbpm4_hist_actinst流程活动实例表,数据如下所示:


在企业应用中FORK/JOIN节点有什么作用呢?会签(就是一个文件需要很多人签字,但是签字不分顺序,只要都签完了就行)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值