在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节。此时就可以用到activiti的多实例来解决此问题。
一、将一个节点设置成多实例的方法:
要把一个节点设置为多实例,节点xml元素必须设置一个multiInstanceLoopCharacteristics
子元素。
当isSequential=true时,表示的顺序执行,即虽然该节点有多条任务,但只有上一条执行完,才可以执行下一条。
当isSequential=false时,表示的并行执行,即该节点下的多条任务可以同时执行。
二、设置会签环节的参与者:
activiti:collection:用于执行该会签环节的参与参与的人,此处是使用的一个名叫pers的流程变量
activiti:elementVariable:此处表示的是每一个分支都有一个名叫per的流程变量,和上方的activiti:assignee结合使用就可以执行该分支应该由谁来处理。
三.指定会签环节的结束条件:
当画红线的部分返回一个true的时候,该会签环节结束。进入下一个流程执行的环节.
completionCondition中写的是juel表达式。其中的mulitiInstance如果是和spring整合了,就是spring管理的bean的id,否则就是流程变量的key.
四、会签环节中涉及的几个默认的流程变量
1.nrOfInstances 该会签环节中总共有多少个实例
2.nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。
3.nrOfCompletedInstances 已经完成的实例的数量
五、代码如下:
1.分配会签环节的人:
/** * 分配下一环节会签的人 * * @author huan * */ public class AssgineeMultiInstancePer implements JavaDelegate { @Override public void execute(DelegateExecution execution) throws Exception { System.out.println("设置会签环节的人员."); execution.setVariable("pers", Arrays.asList("张三", "李四", "王五", "赵六")); } }
2.多实例判断完成的条件:(注意:有于我没有和spring整合,所以此类要实现Serializable接口)
/** * 多实例完成的条件判断 * @author huan */ public class MulitiInstanceCompleteTask implements Serializable { private static final long serialVersionUID = 1L; public boolean completeTask(DelegateExecution execution) { System.out.println("总的会签任务数量:" + execution.getVariable("nrOfInstances") + "当前获取的会签任务数量:" + execution.getVariable("nrOfActiveInstances") + " - " + "已经完成的会签任务数量:" + execution.getVariable("nrOfCompletedInstances")); System.out.println("I am invoked."); return false; } }
3.会签环节中的一个监听器:
/** * 测试会签过程中监听器的执行情况 * @author huan */ public class TestLinstener implements TaskListener { private static final long serialVersionUID = -5754522101489239675L; @Override public void notify(DelegateTask delegateTask) { System.out.print(delegateTask.getId() + " - " + delegateTask.getProcessInstanceId() + " - " + delegateTask.getEventName() + " - " + delegateTask.getTaskDefinitionKey()); } }
4.测试代码:
/** * 测试会签 * @author huan */ public class TestMultiInstance { @Test public void testProcess() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); Deployment deploy = repositoryService.createDeployment()// .name("会签流程测试")// .addInputStream("multiInstances.bpmn", this.getClass().getResourceAsStream("multiInstances.bpmn"))// .addInputStream("multiInstances.png", this.getClass().getResourceAsStream("multiInstances.png"))// .deploy(); System.out.println(deploy.getId() + " " + deploy.getName()); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("mulitiInstance", new MulitiInstanceCompleteTask()); ProcessInstance pi = runtimeService.startProcessInstanceByKey("multiInstances",variables); System.out.println(pi.getId() + " " + pi.getActivityId()); Task task1 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("张三").singleResult(); System.out.println(task1.getId() + " - " + task1.getAssignee() + " - " + task1.getProcessInstanceId() + " - " + task1.getProcessDefinitionId()); Task task2 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("李四").singleResult(); System.out.println(task2.getId() + " - " + task2.getAssignee() + " - " + task2.getProcessInstanceId() + " - " + task2.getProcessDefinitionId()); Task task3 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("王五").singleResult(); System.out.println(task3.getId() + " - " + task3.getAssignee() + " - " + task3.getProcessInstanceId() + " - " + task3.getProcessDefinitionId()); Task task4 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("赵六").singleResult(); if (task4 != null) { System.out.println(task4.getId() + " - " + task4.getAssignee() + " - " + task4.getProcessInstanceId() + " - " + task4.getProcessDefinitionId()); } Task task5 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("钱七").singleResult(); System.out.println(task5); taskService.complete(task1.getId()); taskService.complete(task2.getId()); taskService.complete(task3.getId()); Task task6 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("钱七").singleResult(); System.out.println(task6); taskService.complete(task4.getId()); Task task7 = taskService.createTaskQuery().processInstanceId(pi.getId()).taskAssignee("钱七").singleResult(); System.out.println(task7); taskService.complete(task7.getId()); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(pi.getId()).singleResult(); if (null == processInstance) { System.out.println("流程完成."); } } }
5.流程文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="multiInstances" name="流程会签测试" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="A001"></sequenceFlow> <serviceTask id="A001" name="设置下一环节的人" activiti:class="com.huan.activiti.liuyang.会签.AssgineeMultiInstancePer"></serviceTask> <userTask id="B001" name="会签环节" activiti:assignee="${per}"> <extensionElements> <activiti:taskListener event="complete" class="com.huan.activiti.liuyang.会签.TestLinstener"></activiti:taskListener> </extensionElements> <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="pers" activiti:elementVariable="per"> <completionCondition>${mulitiInstance.completeTask(execution)}</completionCondition> </multiInstanceLoopCharacteristics> </userTask> <sequenceFlow id="flow2" sourceRef="A001" targetRef="B001"></sequenceFlow> <userTask id="C001" name="会签后的环节" activiti:assignee="钱七"></userTask> <sequenceFlow id="flow3" sourceRef="B001" targetRef="C001"></sequenceFlow> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow4" sourceRef="C001" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_multiInstances"> <bpmndi:BPMNPlane bpmnElement="multiInstances" id="BPMNPlane_multiInstances"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="100.0" y="240.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="A001" id="BPMNShape_A001"> <omgdc:Bounds height="71.0" width="117.0" x="190.0" y="222.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="B001" id="BPMNShape_B001"> <omgdc:Bounds height="55.0" width="105.0" x="380.0" y="230.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="C001" id="BPMNShape_C001"> <omgdc:Bounds height="55.0" width="105.0" x="561.0" y="230.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="740.0" y="240.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="135.0" y="257.0"></omgdi:waypoint> <omgdi:waypoint x="190.0" y="257.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="307.0" y="257.0"></omgdi:waypoint> <omgdi:waypoint x="380.0" y="257.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="485.0" y="257.0"></omgdi:waypoint> <omgdi:waypoint x="561.0" y="257.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> <omgdi:waypoint x="666.0" y="257.0"></omgdi:waypoint> <omgdi:waypoint x="740.0" y="257.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
7.流程图:
如若那个地方写的不对,欢迎指出。
相关推荐
【标题】"Activiti多实例任务实现会签"是指在Activiti工作流引擎中,如何配置和使用多实例任务来实现会签功能。在企业级应用中,会签常常用于决策过程,要求多个参与者共同审批,只有当所有参与者都完成审批后,流程...
这通常通过 BPMN 2.0 的并行多实例(Parallel Multi-instance)概念来实现,用以模拟工作流中的“所有人必须同意”或“多数同意”的场景。`voterProcess.bpmn` 文件就包含了一个定义了这种会签任务的流程定义。 2. ...
在用activiti的时候经常遇到取会签人员的问题,这个文档解决怎么获取会签人员。
### Activiti多实例任务实现会签功能详解 #### 一、多实例用户任务的基本概念与配置 Activiti是一个开源的工作流引擎,它提供了一种灵活的方式来定义业务流程,并且能够支持复杂的业务逻辑处理。其中,多实例任务...
在Activiti中,这通常通过多实例任务(Multi-instance Task)来实现。 1. **配置多实例任务**:在BPMN 2.0流程图中,我们可以使用`miBody`元素来定义一个多实例任务。例如,使用`userTask`并添加`camunda:...
在Activiti工作流引擎中,会签功能是通过多实例任务(Multi-instance Task)来实现的。这使得流程能够根据特定的规则分配给多个参与者,且这些参与者可以同时进行处理。 **会签类型** 1. **按数量通过**:当参与...
本实例将带你深入了解如何使用Activiti在网页环境中实现请假流程的申请、启动、部署和管理。 1. **Activiti简介** Activiti 是由Alfresco Software公司开发的轻量级工作流引擎,它基于BPMN 2.0标准,能够以图形化...
这个实例是关于如何使用 Activiti 实现一个请假流程的详细示例。在本文中,我们将深入探讨 Activiti 的核心概念、请假流程的设计以及如何在实际项目中部署和运行这个流程。 1. **Activiti 简介** Activiti 是基于 ...
这个是Activiti开发的请假流程实例,可以作为用Activiti开发工作流的参考;项目采用spring+hibernate+strus2+activity开发,可以运行;数据库采用oracle,其中 QingJia 和 QingJiaHis 是自己的业务表,分别表示 请假...
由于网上关于 Activiti 的实例相对较少,这个实例对于学习和理解 Activiti 的功能和用法尤其有价值。 在 Activiti 中,工作流主要通过定义 BPMN(Business Process Model and Notation)2.0 格式的流程图来创建。...
在“工作流例子-activiti5”中,我们将探讨如何使用 Activiti 5 来实现这些功能。Activiti 5 是 Activiti 的一个旧版本,但依然包含许多关键特性,如流程定义、流程实例管理、任务处理和历史查询。 首先,让我们...
这个实例代码包主要涵盖了Activiti的核心功能,包括实例化工作流、获取任务、执行任务、任务追踪以及查看历史任务等关键操作。通过理解这些知识点,开发者可以更好地在实际项目中应用Activiti。 首先,我们来探讨...
在本实例中,我们将探讨如何将这两个优秀框架整合起来,利用 Activiti Modeler 在 Spring Boot 应用中实现业务流程的可视化设计和执行。 首先,我们需要理解 Spring Boot 如何配置 Activiti。在 Spring Boot 项目中...
Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级流程管理。它提供了一整套数据结构来支持流程定义、执行以及相关的管理活动。在"activiti数据结构详情"中,我们主要关注的是25张核心表的数据结构,...
1. 调用Activiti API启动流程实例,这将根据流程定义创建一个新的运行实例。 2. 在启动时,可以传递变量(如业务数据)给流程实例,这些变量将在流程执行过程中被引用。 六、任务处理 1. 当流程实例到达某个任务...
【标题】"Activiti工作流之流程实例、任务的执行" 在企业级应用开发中,工作流管理系统(Workflow Management System, WfMS)扮演着重要角色,它负责自动化业务流程,确保任务按照预定义的规则有序进行。Activiti是...
这个入门实例将引导你快速掌握 Activiti 的基本使用,特别是通过一个具体的“请假”实例来加深理解。 在Activiti中,业务流程通常由一系列的任务(Tasks)组成,这些任务可以通过流程定义(Process Definition)来...
【标题】"activiti5.9 请假流程例子 eclipse项目" 在企业级应用开发中,工作流管理系统(Workflow Management System)扮演着至关重要的角色,它能够自动化和管理业务流程,提高工作效率。Activiti 是一个开源的...
Jeecg集成activiti.docx Jeecg集成activiti是一个关于如何将activiti集成到Jeecg平台上的指南。下面是从给定的文件中提取的相关知识点: 1. activiti项目结构:activiti项目是一个Maven项目,包含了数据库文件,...