activiti会签 多实例例子

标签: activiti 实例 | 发表时间:2015-10-17 13:25 | 作者:
出处:http://www.iteye.com

    在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节。此时就可以用到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.流程图:

   
   
  如若那个地方写的不对,欢迎指出。

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [activiti 实例] 推荐:

activiti会签 多实例例子

- - ITeye博客
    在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节. 此时就可以用到activiti的多实例来解决此问题. 一、将一个节点设置成多实例的方法:.        要把一个节点设置为多实例,节点xml元素必须设置一个 multiInstanceLoopCharacteristics子元素.

Activiti用户指南之Activiti的API

- - ITeye博客
 一、流程引擎的API和服务(services).      引擎的API是影响Activiti最常见的一种方法. 我们一开始最关注的中心是ProcessEngine,像之前描述的那样,流程引擎可以被多种方式创建. 从这个流程引擎里面,你能获得各个包含workflow/BPM方法的服务. 流程引擎和这些获得的服务是线程安全的.

Activiti学习笔记

- - 企业架构 - ITeye博客
第一个Activiti的HelloWorld. 获取核心ProcessEngine对象 2. 根据需求,获取对应的服务实例 3. 使用服务方法,做事情 * * @author Administrator * */ public class HelloWorld {. // 加载核心API ProcessEngine.

Activiti工作流demo

- - CSDN博客综合推荐文章
继上篇《 Activiti工作流的环境配置》.        前几篇对Activiti工作流进行了介绍,并讲解了其环境配置. 本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货.        以HelloWorld程序为例.       首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功.

Activiti - 设置会签

- - 企业架构 - ITeye博客
前些天在群里聊工作流和Activiti,群里有人分享了自己的工作流引擎开源项目,大伙纷纷问这问那(比如为什么突然自己搞个process engine、有没有eclipse plugin、能不能绘制流程图等等). 现实生活中的工作流程,我们也经常碰到需要会签的情况,支持会签是很必要的. 正好有两个人问道:支持会签吗.

activiti工作流使用

- - 行业应用 - ITeye博客
activiti 开发流程. JBPM 与 Activiti. jBPM项目于2002年3月由Tom Baeyens发起,2003年12月发布1.0版本. 2004年10月18日,发布了2.0版本,并在同一天加入了JBoss. 2011 年 jBPM的创建者Tom Baeyens离开JBoss了, 他的离开产生了两个结果:.

ACTIVITI 学习笔记 - 监听

- - 企业架构 - ITeye博客
ACTIVITI 学习笔记 - 监听. 所有分发的事件都是org.activiti.engine.delegate.event.ActivitiEvent的子类. 监听器监听的流程引擎已经创建完毕,并准备好接受API调用. 监听器监听的流程引擎已经关闭,不再接受API调用. 创建了一个新实体,初始化也完成了.

Activiti安装配置(转)

- - 企业架构 - ITeye博客
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/38655311. 有一段时间没有更新文章了,虽然有一直在写文章,可是一直没有更新到博客内,这段时间写的文章大多还是以技术为主. 接下来的系列文章将会来讨论企业工作流的开发,主要是来研究开源工作流Activiti的使用.

Activiti入门篇之二 Spring 与Activiti的入门整合

- - 行业应用 - ITeye博客
Activiti相对Jbpm来说,与Spring整合更加完美,具体可见本文的详细介绍. 1.     Maven的环境任务,请参考第一篇 (Activiti入门篇—Maven的环境准备). 2.     Activiti的Eclipse插件安装.               插件更新地址:http://activiti.org/designer/update/.

整合activiti在线流程设计器(ACTIVITI-MODELER 5.18.0)

- - 企业架构 - ITeye博客
一直以来都是从事大量的工作流相关的项目,用过很多商用的工作流产品,包括国内与国外的,尽管商用的工作产品在UI操作上比较人性化,但个人用户觉得,这东西只需要一些初级用户,对于我们一直在为一些高级的客户提供一些专业的数据整合、流程梳理、系统间的数据穿透时,这些系统因为不开源,给项目的实施带来巨大的风险,在一些项目栽过跟头后,我更偏向于使用开源的平台了.