Activiti提供两种子流程实现:

1、嵌入子流程
子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观;
2、调用子流程
首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用<callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。
下面通过实例来看下两者的实现:
一、嵌入子流程
1、流程图
以下是流程图的xml表示,可以看到主流程中有一段由标签<subprocess>包围的部分即时流程图中的
SubProcess的xml表示:
 

二、调用子流程

1、流程图

主流程:callProcess

主流程xml表示:

其中使用标签<callActiviti>的属性calledElement指明子流程定义,并实现主流程与子流程之间进行数据交换,<activiti:in/>由主流程传入子流程,<activiti:out/>由子流程传给主流程
       

子流程:callledProcess

子流程xml表示,可以看到子流程就是一个正常的独立流程,流程id为calledProcess:

2、应用实例
首先,启动流程代码如下,在发起时给主流程加入全局变量,方便子流程获取,并且在最后记录审批日志,最终我们会看到整个业务流程的日志都是以唯一流程标识划分的:
/***
*启动流程并记录日志
*@param businessKey 流程唯一标识
*@param businessType 业务类型
*@param businessId 业务id
* */
public void start(Long businessKey, Integer businessType, Long businessId, Operator operator) {
//主流程变量
MapapproveParam = new HashMap<>();
approveParam.put("businessKey", businessKey);
approveParam.put("businessType", businessType);
approveParam.put("businessId", businessId);
// 启动流程
runtimeService.startProcessInstanceByKey("callProcess", businessKey.toString(),
approveParam);
// 记录日志
approveRecordService.saveApproveRecord(businessKey, businessType, businessId, "-1",
FlowNode.Startevent.getCode(), operator.getOperatorId(), ApproveOperation.START.getCode(), "启动流程");
}
执行流程代码如下:
 /**
* 审核
* @param businessKey 流程唯一标识
* */
public void approve(Long businessKey){
//审核变量
MapapproveParam = new HashMap<>();
approveParam.put("approve", "pass");
//获取当前任务
Task currentTask = taskService.createTaskQuery().processInstanceBusinessKey(businessKey.toString()).singleResult();
Mapvariables = currentTask.getProcessVariables();
// 级联结束本节点发起的会签任务
String parentTaskId = currentTask.getParentTaskId();
if (parentTaskId != null) {
Listtasks = taskService.createTaskQuery().taskId(parentTaskId).taskDescription("JOINT_PROCESS").list();
for (Task task : tasks) {
taskService.setVariablesLocal(task.getId(), null);
taskService.complete(task.getId(), null);
}
}
//完成当前任务
taskService.setVariablesLocal(currentTask.getId(), approveParam);
taskService.complete(currentTask.getId(), approveParam);
// 记录日志
approveRecordService.saveApproveRecord(businessKey, (Integer)variables.get("businessType"),
(Long)variables.get("businessId"), "-1",
FlowNode.Startevent.getCode(), 888L,
ApproveOperation.START.getCode(), "启动流程");
}

如主流程所示,我们发起流程后,执行beforecall,完成后将进入调用子流程Call Activiti模块中,这时子流程会自动跳过空开始结点,生成subTask用户任务的执行实例和任务,在ACT_RU_EXECUTION和ACT_RU_TASK表中各产生一条新的记录。
但是生成的执行实例缺少唯一业务标识businessKey,这个需要通过监听器实现。
如子流程xml中所示,我们给subTask和subTask2都配置了任务监听器 
 <activiti:taskListener event="create" delegateExpression="${subProcessTestListener}"></activiti:taskListener>
来,上监听器代码~~~~~~~~~
@Service
public class SubProcessTestListener implements TaskListener {
private static final long serialVersionUID = 1L;
@Autowired
private RuntimeService runtimeService;
@Transactional
public void notify(DelegateTask delegateTask){
System.err.println("1.子流程任务创建======delegateTask{}:" + delegateTask.getId());
//获取子流程变量
DelegateExecution execution =  delegateTask.getExecution();
Long businessId = (Long)execution.getVariable("businessId");
Integer businessType = (Integer)execution.getVariable("businessType");
Long businessKey = (Long)execution.getVariable("businessKey");
System.err.println(
"2.获取子流程参数======businessId:" + businessId + ";businessType:" + businessType
+ ";businessKey:" + businessKey);
//子流程实例set业务单号和主流程保持一致
runtimeService.updateBusinessKey(delegateTask.getProcessInstanceId(), businessKey.toString());
}
}

这里可以看到主流程xml中,主流程的变量子流程都可以接到,我们利用这些变量中businessKey业务标识,在监听器中填充子流程subTask实例的BUSINESS_KEY_字段,使得子流程和主流程保持业务标识一致,我们流程就可以继续跑下去了。
<callActivity id="callactivity1" name="Call activity" calledElement="calledProcess">
      <extensionElements>
        <activiti:in source="businessId" target="businessId"></activiti:in>
        <activiti:in source="businessType" target="businessType"></activiti:in>
        <activiti:in source="businessKey" target="businessKey"></activiti:in>
      </extensionElements>
  </callActivity>
配置监听器后,调用子流程时,生成实例set了业务标识

调用子流程执行结束,同时,子流程实例完成,工作流将重新回到主流程:
正常执行主流程,直到结束,整个业务流程如下:

Activiti子流程学习相关推荐

  1. activiti 子流程

    https://blog.csdn.net/lazy_cpp/article/details/77979634 https://blog.csdn.net/shirdrn/article/detail ...

  2. Activiti中的关于子流程中的并发节点标记处理

    最近在研究一个轻量级的工作流引擎Activiti,就遇到了子流程中无法标记其并发节点的问题,经过几天的研究,想到了一个简单易懂的方法,总结如下,希望对你们能有所帮助,有写的不对的地方,还希望大家多提宝 ...

  3. java中bpmn流程图_Java学习之BPMN知识以及Activiti的流程部署

    BPMN的介绍 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和 ...

  4. Activiti 多个并发子流程的应用

    应用场景: 多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批. 流程如下: 要解决以上问题,需要实现多个 ...

  5. Activiti 5.3:子流程(subProcess)

    Activiti 5.3提供了子流程的实现,包括两种基于子流程的实现: 一种是内嵌子流程:子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程 ...

  6. Activiti的BPMN2.0中的子流程

    Activiti的BPMN2.0中的子流程分为两种类型: 第一种:Sub-Process 第二种:Call Activities

  7. 基于Activiti的流程应用开发平台JSAAS-WF V5.3

    第1章 产品概述及体系架构 1.1.概述 红迅JSAAS-WF工作流平台V5是广州红迅软件有限公司面向合作伙伴以及有IT运维团队中大型企业提供新一代的流程管理产品,它基于流行的JAVA开源技术上构建, ...

  8. node.js的开发流程_Node.js子流程:您需要了解的一切

    node.js的开发流程 by Samer Buna 通过Samer Buna Node.js子流程:您需要了解的一切 (Node.js Child Processes: Everything you ...

  9. agilebpm脑图_干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架

    干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 [干货]基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 前言 在工作中,难免会遇到需要开发基于流程管 ...

最新文章

  1. SQL Server 2005 命令行实用工具
  2. Python Flask-表单提交方式
  3. 90-40-009-源码-CUBE-引擎为Spark写入Hbase本
  4. 《Splunk智能运维实战》——第1章 游戏时间——导入数据 1.1 简介
  5. Python中ASCII码的数字和字符的转换
  6. SpringMVC学习笔记(1)-SpringMVC介绍
  7. paip.论大数据的方法,技术erlang,haddop.attilax总结.
  8. ubuntu开机启动+图标配置
  9. Linux Command ss
  10. Windows使用批处理文件更改指定目录下的文件名(含序号)
  11. Cluster04 - Ceph概述 部署Ceph集群 Ceph块存储
  12. FPGA秋招面试手撕代码20+
  13. AW9523B IIC驱动
  14. 查看电脑自带的Office版本信息重新安装Office
  15. 北风:利用微信红包封面怎么引流和变现(案例)
  16. 局域网联机_【进击的巨人21】【全DLCs整合】【局域网联机】【免安装解压即玩】 免费分享...
  17. 0-1000Hz频率转4-20mA隔离变送器贝福IBF
  18. 解决VMware 16在Win7虚拟机安装VMware Tools时报 “Windows 无法验证此驱动程序软件的发布者”问题
  19. 通用查询实现方案(可用于DDD)[附源码] -- 简介
  20. 算法-动态规划-股票交易

热门文章

  1. PC版收音机—龙卷风收音机
  2. 来一个大神指点一下指针迷津
  3. 2022年安徽建筑施工电工(建筑特种作业)模拟试题及答案
  4. 用于机器学习的 Pandas(ML)
  5. 服务器系统兼容性问题,服务器系统兼容性测试
  6. Yann LeCun主讲,纽约大学《深度学习》2021春季课程放出,免费可看
  7. 女人洞房那天以后——男同胞要学
  8. 2023计算机毕业设计SSM最新选题之java免税店销售系统n969j
  9. 品牌商家居行业如何做好企业客户运营?
  10. 电力系统机组组合优化(附代码)