Activiti 多个并发子流程的应用
多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批。
流程如下:
要解决以上问题,需要实现多个子流程并行处理的功能。在Activiti5有一个比较强的节点属性就是多实例,它可以支持多实例的子流程,多实例任务,多实体脚本等。目前支持多实例的节点类型有:
多实例还有并行、串行区分。以下解释一下什么是并行与串行
并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响。
串行代表工作或任务由一个人完成后,再由另一个人去处理,直至全部完成,每个任务依赖于前一个任务完成。
会签任务即可以由activiti多实例任务节点来实现,(上一博客有介绍如何开发设计会签任务)
在Activiti的定义中,生成多实例的定义很简单,只需要如下类似去生成以下标签,则可以完成多实例的声明,如下所示,我们要支持并行节点的多实例的定义
多实例人工任务
- "${assignee}" id= "SignTask2" name= "财务主管会签" >
- class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener"
- event="create" />
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getSignUser(execution)}">
- ${signComplete.isComplete(execution) }
多实例子流程
- "${assignee}" id= "SubProcess1"
- name="部门资金计划流程">
- "startUser" id="startEvent2"
- name="开始" />
- "endEvent1" name="结束1" />
- "task3" name="助理填写">
- class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
- event="create" />
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- "task4" name="部门领导审查">
- class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
- event="create" />
- class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
- event="assignment" />
- class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
- event="complete" />
- "startEvent2" targetRef="task3"
- id="sequenceFlow1" name="" />
- "task3" targetRef="task4" id="sequenceFlow2"
- name="" />
- "task4" targetRef="endEvent1" id="sequenceFlow3"
- name="" />
- "start"
- class="com.hotent.platform.service.bpm.listener.StartEventListener" />
- "end"
- class="com.hotent.platform.service.bpm.listener.EndEventListener" />
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getMultipleUser(execution)}" />
所以关键的配置属性:
- activiti:elementVariable="assignee" isSequential="false"
- activiti:collection="${taskUserAssignService.getSignUser(execution)}">
- ${signComplete.isComplete(execution) }
我们在控制多实例的个数或人数时,是通过taskUserAssignService的getSignUser获取或getMultipleUser(execution)其集合的个数,从而决定产生多少个实体任务或子流程。
如实现子流程多实例的获取人数,则来自:
- /**
- * 获取多实体子流程的执行用户集合
- * @param execution
- * @return
- * @throws Execption
- */
- public List getMultipleUser(ActivityExecution execution) throws Exception{
- String nodeId=execution.getActivity().getId();
- ExecutionEntity executionEnt=(ExecutionEntity) execution;
- List userIds=(List )execution.getVariable(BpmConst.SUBPRO_MULTI_USERIDS);
- if(userIds!=null) return userIds;
- Map <string,flownode> nodeMap= NodeCache.getByActDefId(executionEnt.getProcessDefinitionId());
- FlowNode subProcessNode=nodeMap.get(nodeId);
- FlowNode firstNode=subProcessNode.getSubFirstNode();
- FlowNode secodeNode=firstNode.getNextFlowNodes().get(0);
- List userList=nodeUserMapLocal.get().get(secodeNode.getNodeId());
- logger.debug("userList size:" + userList.size());
- execution.setVariable(BpmConst.SUBPRO_MULTI_USERIDS, userList);
- return userList;
- }
因为该方法会被调用多次,所以其实现的思路是第一次其集合是来自用户的界面选择的人员列表,第一次之后,放到流程变量中去,在后续的获取中,直接从流程变量中获取。
然后在任务的创建的监听器中,从流程变量assignee中获取当前任务的执行人。以上的实现还有一细节就是要解决如何查找到子流程中的第一个任务节点,并且把对应的任务人员授给这任务节点。
最终实现的效果如下所示:
Activiti 多个并发子流程的应用的更多相关文章
- 【Activiti学习之七】BPMN子流程、顺序流、流程关口
环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.子流程 1.嵌入子流程2.调用子流程3.事件子流程4.事务子流程 二.顺序流1.条件 ...
- Hawk 6. 高级话题:子流程系统
子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...
- visio子流程创建
已经画好了流程,想将一部分抽取成子流程: 多选中要抽取成子流程的的框图,点 菜单栏 中的 进程 选项,点此选项卡下面的第三个按钮: 根据所选内容创建 这样就会自动生成子流程,子流程的具体位置在 左下 ...
- Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型
开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...
- Activiti 查询最新版本的流程定义
package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- Activiti工作流(三)——流程变量
流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal error war ...
- (六)Activiti之实现学生请假流程
一.实现学生请假流程 1.1 用activiti插件生成bpmn和png文件 1.2 部署流程定义 package com.shyroke.activiti.firstActiviti; import ...
随机推荐
- LCIS 最长公共上升子序列
这个博客好久没写了,这几天为了准备清华交叉研究院的夏令营,在复习大一大二ACM训练时的一些基础算法,正好碰到LICS,发现没有写在博客里,那就顺便记录一下好了. 参考链接:http://blog.cs ...
- iOS验证码倒计时(GCD实现)
+ (void)verificationCode:(void(^)())blockYes blockNo:(void(^)(id time))blockNo { __block ; //倒计时时间 d ...
- 作品展示,JavaScript 版水果忍者
点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...
- Linux网络编程3——socket
宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* & ...
- 在.NET中使用Newtonsoft.Json转换,读取,写入的方法介绍
全局引用 using Newtonsoft.Json; using Newtonsoft.Json.Converters; //把Json字符串反序列化为对象 目标对象 = JavaScriptCon ...
- SpringMVC深入探究(1)——DispatcherServlet与初始化主线
在上一篇文章中,我们给出了构成SpringMVC应用程序的三要素以及三要素的设计过程.让我们来归纳一下整个设计过程中的一些要点: SpringMVC将Http处理流程抽象为一个又一个处理单元 Spri ...
- 学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期
在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...
- [vim]设置vim语法高亮显示和自动缩进
1.配置文件的位置 在目录 /etc/vim下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为 ...
- webapp 开发之iScroll 学习
demo.html <!doctype html> <html lang="en"> <head> <meta charset=" ...
- NDK(4)"Unresolved inclusion jni.h”的解决方法
参考 : http://blog.csdn.net/zhubin215130/article/details/39347873 3种解决办法: 一,重新初始化eclipse对该project的nat ...