activiti学习之多实例任务

本文介绍了在Activiti工作流中如何设置和测试多实例任务节点,通过XML配置展示了多实例任务的实现,并提供了部署流程、启动流程实例以及完成任务的代码示例。在多实例任务中,当一定比例的任务被完成时,整个节点将结束。
摘要由CSDN通过智能技术生成

写在前面

在实际的业务场景中可能一个节点同时需要多个人来办理,比如开会签到的场景,或者是投票的场景,此时就需要使用到多实例任务,下面我们一起来看下。

1:测试

1.1:设计流程

  • 效果图

在这里插入图片描述

多实例节点"多实例任务节点"设置如下图:

在这里插入图片描述

在这里插入图片描述

  • xml
<?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="csdnMultiInstance" name="csdnMultiInstance" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="正常任务节点" activiti:assignee="张三">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <userTask id="usertask2" name="多实例任务节点" activiti:assignee="${user}">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler">false</modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="users" activiti:elementVariable="user">
        <completionCondition>${nrOfCompletedInstances/nrOfInstances &gt;= 0.5}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_csdnMultiInstance">
    <bpmndi:BPMNPlane bpmnElement="csdnMultiInstance" id="BPMNPlane_csdnMultiInstance">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="110.0" y="270.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="320.0" y="260.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="610.0" y="260.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="870.0" y="270.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="145.0" y="287.0"></omgdi:waypoint>
        <omgdi:waypoint x="320.0" y="287.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="425.0" y="287.0"></omgdi:waypoint>
        <omgdi:waypoint x="610.0" y="287.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="715.0" y="287.0"></omgdi:waypoint>
        <omgdi:waypoint x="870.0" y="287.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

1.2:部署流程

/**
 * 部署流程定义
 */
@Test
public void deploy() {
    Deployment deployment = repositoryService.createDeployment() // 创建部署
            .addClasspathResource("com/jh/activiti/csdnMultiInstance.bpmn20.xml") // 加载流程资源文件
            .name("csdn多实例测试") // 流程名称
            .deploy(); // 部署
    System.out.println("流程部署ID:" + deployment.getId());
    System.out.println("流程部署Name:" + deployment.getName());
}

在这里插入图片描述

在这里插入图片描述

1.3:创建流程定义

@Test
public void startInstance() {
    runtimeService.startProcessInstanceByKey("csdnMultiInstance");
}

在这里插入图片描述

生成的任务:

在这里插入图片描述

1.4:完成任务

完成任务并指定多实例任务"多实例任务节点"的办理人:

@Test
public void complete() {
    Map<String, Object> variables = new HashMap<String, Object>();
    variables.put("users", Arrays.asList("test1,test2,test3,test4".split(",")));
    taskService.complete("855007", variables);
}

针对"test1,test2,test3,test4"生成了4个任务,如下图:

在这里插入图片描述

因为我们设置了${nrOfCompletedInstances/nrOfInstances &gt;= 0.5}所以有2个人完成任务,该节点就会结束,直接使用taskService.complete(taskId)来测试:

首先执行taskService.complete("857520");完成一个任务,变为如下图:

在这里插入图片描述

首先执行taskService.complete("857525");完成一个任务,可以看到剩余的2个任务就自动结束了,变为如下图:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值