在项目中有子流程和多实例的需求,总结如下:
一、子流程

子流程分为两种:

  1. CallActivity(调用任务)
  2. SubProcess(子流程)

由于调用任务能将子任务分离开来,能够分别显示单独的流程图,实际在项目中用到更多的是调用任务,这里我们主要介绍调用任务:
调用任务的流程图如下:

父流程图1

子流程图2

图1中我们有一个普通的任务task1和一个调用任务,图2是图1调用任务要调用的流程,只有一个普通的任务sonTask,图中这个任务下面有三道竖线说明它是多实例任务,我们一会儿再介绍,先不管它。
图中的主要属性如下:

  • 父流程:{Id:parentProcess};
  • task1:{Id:usertask1,Assignee:parent};
  • 调用任务:{Id:callactivity1,Called element:sunProcess}
  • 子流程:{Id:sunProcess};
  • sonTask:{Id:usertask2,Assignee:son};

可以看到调用任务的配置很简单,只需要将Called element的属性值修改为需要调用的子流程id即可。
部署时父子流程都需要部署:

/*** 部署流程定义(classpath)*/@Testpublic void deploymentProcessDefinition() {Deployment dp = pe.getRepositoryService().createDeployment().name("父子流程").addClasspathResource("diagrams/Parent.bpmn").addClasspathResource("diagrams/Parent.png").addClasspathResource("diagrams/Son.bpmn").addClasspathResource("diagrams/Son.png").deploy();System.out.println("部署ID:"+dp.getId());System.out.println("部署名称:"+dp.getName());}

启动流程实例时只启动父流程:

/*** 启动流程实例*/@Testpublic void startProcessInstance() {String processDefinitionKey = "parentProcess";ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);System.out.println("流程实例ID:"+pi.getProcessInstanceId());System.out.println("流程定义ID:"+pi.getProcessDefinitionId());}

接下来把流程跑通一遍,我们来看一下act_hi_actinst表的数据:

当完成usertask1之后,任务节点到达了callactivity,表中的CALL_PROC_INST_ID_字段代表了要调用哪个流程,这时直接开启了proc_inst_id_为5003的子流程,完成了startevent1节点,到达了usertask2任务,当完成usertask2之后,子流程结束,父流程结束,整个流程执行完毕。

这是最简单的调用任务,但是如果我们在父流程中设置了流程变量,我们就需要将流程变量传到子流程当中,这时就需要配置callactivity的Input parameters和Output parameters属性:

其中Source是父流程的流程变量名称,Target是子流程的流程变量名称,也就是说子流程和父流程中对应同一个流程变量的名字可以不同,我们映射一下就可以了。同理Output parameters配置的是从子流程中返回的流程变量和父流程的映射关系。如果我们的流程变量是javabean的话,我们就用EL表达式来配置Source expression和Target expression。
我们在父流程中设置一个流程变量name,用来动态的设置子流程usertask2任务的办理人,我们需要将Source和Target属性都设置为name,将usertask2的Assignee属性设置为${name},我们再跑通一次流程,观察一下表中的变化:

act_ru_variable表1

act_hi_actinst表2

我们在启动父流程的时候设置了流程变量name:

/*** 启动流程实例*/@Testpublic void startProcessInstance() {String processDefinitionKey = "parentProcess";Map<String, Object> map = new HashMap<String, Object>();map.put("name", "xiaowang");ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(processDefinitionKey,map);System.out.println("流程实例ID:"+pi.getProcessInstanceId());System.out.println("流程定义ID:"+pi.getProcessDefinitionId());}

我们看表一中父流程和子流程都有一个叫name的流程变量,说明流程变量传进了子流程,同时子流程的usertask2的办理人设置成了”xiaowang”,完成了动态设置办理人的需求。outputparameter的设置同理,大家可以自行测试。

这里还有一个建议,如果有调用任务的需求,我们在开发中最好用javabean类型的流程变量来存储业务数据,否则我们在inputparameter和outputparameter中就需要手动设置所有的流程变量,很麻烦,还需要去代码中看我到底设置了哪些流程变量。

二、多实例
单独的多实例比较简单,只是配置任务的几个属性就可以了。如下:

1.Sequential是设置多实例任务是同步执行还是按照顺序执行,”false”为同步执行;
2.Collection是多实例的核心属性,值为集合类型的流程变量名称,这里我在启动流程实例时设置了一个类型为List的流程变量,名称为names,代码如下:

/*** 启动流程实例*/@Testpublic void startProcessInstance() {String processDefinitionKey = "sunProcess";Map<String, Object> map = new HashMap<String, Object>();List<String> names = new ArrayList<String>();names.add("xiaowang");names.add("xiaoli");names.add("xiaozhang");map.put("names", names);ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(processDefinitionKey,map);System.out.println("流程实例ID:"+pi.getProcessInstanceId());System.out.println("流程定义ID:"+pi.getProcessDefinitionId());}

3.Element variable为Collection中每一个元素的名称,这个名称是自己定义的,当我们要使用多实例集合中的每一个元素时,总要有个名字。我们在动态设置每一个实例执行对象的Assignee时,用到了这个name:

这样的话,每一个实例就可以根据我们程序中List的每一个元素值来动态设置,我们看一下表中的执行结果:

act_hi_actinst表
这里我们可以看到同时执行的usertask2有三个,分别动态赋予了不同的Assignee,并且他们的execution_id是不同的,所以在多实例或者有分支和并行的流程中,我们能够看出流程实例id(proc_inst_id_)和执行对象id(execution_id_)其实是不同的。

不过很多时候多实例流程不只需要动态配置一个assignee属性,这种时候我们需要将流程变量List中的元素改成javabean对象,在配置assignee时用对象的属性来配置:

这里需要补充的是所有的多实例跑完才会执行下一步流程。

工作流子流程和多实例开发相关推荐

  1. flowable工作流子流程调用

    flowable工作流子流程介绍 工作流提供了子流程的调用,一种是内部子流程,可以让用户主要看主流程,保持业务清晰,另一种是引用外部子流程(call activity),复用外部流程功能. 工作中有用 ...

  2. Camunda 工作流并行子流程、工作流会签、或签、加签、比例签、跳转节点

    如下图为一个流程图,其需求过程如下: 1.某业务员发起一个登记单 2.领导审批 3.领导选择多个部门进行阅办,每个部门并行进行 4.部门内有两个审批环节(环节一:部门经理或经理助理或签,环节二:部门内 ...

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

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

  4. 获取第一个子元素_Activiti 开发案例之多实例并行子流程

    概念 Activiti 提供了两种基于子流程的实现: 一种是内嵌子流程:子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外 ...

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

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

  6. 工作流引擎设计之子流程功能实现

    一个成熟的工作流管理系统,其引擎对于子流程功能的支持必然是不可少的,这好比是一门编程语言支持函数那么普遍一样.在当前Workflow, BPM, EAI产品的建模工具中,对于子流程/子过程的应用如家常 ...

  7. 《Activiti/Flowable 深入BPM工作流》-流程实例怎么实现挂起?

    <Activiti/Flowable  深入BPM工作流>-流程实例怎么实现挂起? 一. 问题 1. 什么情况要进行流程的挂起? 2. 具体怎么将流程挂起? 二. 详情   1. 什么情况 ...

  8. Activiti7工作流引擎:进阶篇(七) 调用子流程 CallActivityTask

    知识传送门 >>>>>>>>>>>>>>>>>>> 造句:"朋友" ...

  9. activity工作流调用子流程 callActivity

    最近项目中需要用到工作流,其中需要用到工作流中的调用子流程功能,折腾半天完工之后记录一下. 主流程图 子流程图 一个简单的例子说明一下 最关键的是在调用子流程这个模块的properties 中配置要调 ...

最新文章

  1. python有道api-python 调用有道api接口的方法
  2. 我们一般的前端开发流程
  3. 全球规模最大的全浸没式液冷数据中心落户杭州余杭
  4. LruCache缓存bitmap(一)
  5. jmeter脚本_性能工具之Jmeter脚本python启动
  6. keycloak集群化的思考
  7. leaflet调用mysql_Leaflet地图框架使用手册——L.Path
  8. MYSQL关于日期统计常用的SQL语句
  9. pixel和毫米怎么换算_赶紧收藏!小学阶段所有公式、单位换算、数量关系
  10. dom jaxp详解
  11. 设计模式(十)——代理模式
  12. 如何系统的自学python-自学Python应该如何正确系统学习,避免少走弯路
  13. 全世界都误会我们了。。。。。。。。
  14. sed 追加文本类容_浅谈Linux三剑客中的sed命令之篇二
  15. 怎么利用计算机自带功能删除垃圾,win7系统怎么清除电脑里的垃圾
  16. 【社会相关】:大神写的考研政治复习攻略
  17. android教你打造独一无二的图片加载框架
  18. 中国巡游帆船行业市场供需与战略研究报告
  19. 温湿度监测云平台—解决异地仓储与集团总部远程温湿度监控难题
  20. Git使用教程——最易懂的教程

热门文章

  1. 计算机无法读入内存怎么办,Win10提示内存不能为read怎么办 三种方法快速解决内存read问题...
  2. Win7开启ACHI模式蓝屏的解决办法
  3. 探探速锐得驾考OBD模块内核“技术”功夫到底如何?
  4. 英语单词打卡软件测试,那些在朋友圈疯狂晒英语打卡的人,后来都怎么样了?...
  5. 如何把中文数字字符串转成十六进制byte[]
  6. 36氪WISE大会发布新经济之王 百位时代领袖重新定义未来
  7. Forrester:一年内将改变云格局的九大趋势
  8. 修改 MySQL 数据库字符集
  9. 以太坊:区块(Blocks)
  10. Arduino工程源码分析