Activiti 网关

来源:互联网 发布:手机淘宝怎样撤销投诉 编辑:程序博客网 时间:2024/05/01 00:17

网关用来控制流程的流向,分为两种:排他网关(exclusiveGateWay,只允许路径上的一条路径执行)和并行网关(parallelGateWay,分叉点后面的路径可以同时执行,没有先后)。
下面我们来看一下两个例子:

排他网关

当用户提交报销申请单之后,系统根据报销金额自动流转到对应任务。
当用户提交报销申请单之后,系统根据报销金额自动流转到对应任务。
exclusiveGateWay.bpmn

<?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="exclusiveGateWay" name="exclusiveGateWayProcess" isExecutable="true">    <startEvent id="startevent1" name="Start"></startEvent>    <userTask id="usertask1" name="费用报销申请" activiti:assignee="张三"></userTask>    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>    <userTask id="usertask2" name="审批【部门经理】" activiti:assignee="李四"></userTask>    <userTask id="usertask3" name="财务" activiti:assignee="王五"></userTask>    <userTask id="usertask4" name="审批【总经理】" activiti:assignee="赵六"></userTask>    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway" default="默认执行财务"></exclusiveGateway>    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="exclusivegateway1"></sequenceFlow>    <sequenceFlow id="flow3" name="金额小于等于1000,大于等于500" sourceRef="exclusivegateway1" targetRef="usertask2">      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money>=500 && money<=1000}]]></conditionExpression>    </sequenceFlow>    <sequenceFlow id="默认执行财务" name="默认执行财务" sourceRef="exclusivegateway1" targetRef="usertask3"></sequenceFlow>    <sequenceFlow id="flow5" name="金额大于1000元" sourceRef="exclusivegateway1" targetRef="usertask4">      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${money>1000}]]></conditionExpression>    </sequenceFlow>    <endEvent id="endevent1" name="End"></endEvent>    <sequenceFlow id="flow6" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>    <sequenceFlow id="flow7" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>    <sequenceFlow id="flow8" sourceRef="usertask4" targetRef="endevent1"></sequenceFlow>  </process>  <bpmndi:BPMNDiagram id="BPMNDiagram_exclusiveGateWay">    <bpmndi:BPMNPlane bpmnElement="exclusiveGateWay" id="BPMNPlane_exclusiveGateWay">      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">        <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="50.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">        <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="140.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">        <omgdc:Bounds height="55.0" width="105.0" x="80.0" y="390.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">        <omgdc:Bounds height="55.0" width="105.0" x="305.0" y="390.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4">        <omgdc:Bounds height="55.0" width="105.0" x="550.0" y="380.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">        <omgdc:Bounds height="40.0" width="40.0" x="337.0" y="260.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">        <omgdc:Bounds height="35.0" width="35.0" x="340.0" y="560.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">        <omgdi:waypoint x="357.0" y="85.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="140.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">        <omgdi:waypoint x="357.0" y="195.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="260.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">        <omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>        <omgdi:waypoint x="132.0" y="390.0"></omgdi:waypoint>        <bpmndi:BPMNLabel>          <omgdc:Bounds height="42.0" width="100.0" x="-117.0" y="-35.0"></omgdc:Bounds>        </bpmndi:BPMNLabel>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="默认执行财务" id="BPMNEdge_默认执行财务">        <omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="390.0"></omgdi:waypoint>        <bpmndi:BPMNLabel>          <omgdc:Bounds height="14.0" width="100.0" x="10.0" y="0.0"></omgdc:Bounds>        </bpmndi:BPMNLabel>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">        <omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>        <omgdi:waypoint x="602.0" y="380.0"></omgdi:waypoint>        <bpmndi:BPMNLabel>          <omgdc:Bounds height="14.0" width="84.0" x="16.0" y="-15.0"></omgdc:Bounds>        </bpmndi:BPMNLabel>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">        <omgdi:waypoint x="132.0" y="445.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="560.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">        <omgdi:waypoint x="357.0" y="445.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="560.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">        <omgdi:waypoint x="602.0" y="435.0"></omgdi:waypoint>        <omgdi:waypoint x="357.0" y="560.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>    </bpmndi:BPMNPlane>  </bpmndi:BPMNDiagram></definitions>

并行网关

流程实例一旦开始,卖家就可以发货了,同时卖家可以付款,这两项活动不分前后,当卖家收款并且买家收到货物的时候,流程结束。

parallelGateWay.bpmn

<?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="parallelGateWay" name="ParallelGateWay" isExecutable="true">    <startEvent id="startevent1" name="Start"></startEvent>    <parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway>    <parallelGateway id="parallelgateway2" name="Parallel Gateway"></parallelGateway>    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow>    <userTask id="usertask1" name="发货" activiti:assignee="张三"></userTask>    <sequenceFlow id="flow2" sourceRef="parallelgateway1" targetRef="usertask1"></sequenceFlow>    <userTask id="usertask2" name="付款" activiti:assignee="王五"></userTask>    <sequenceFlow id="flow3" sourceRef="parallelgateway1" targetRef="usertask2"></sequenceFlow>    <userTask id="usertask3" name="收货" activiti:assignee="李四"></userTask>    <sequenceFlow id="flow4" sourceRef="usertask1" targetRef="usertask3"></sequenceFlow>    <userTask id="usertask4" name="收款" activiti:assignee="赵六"></userTask>    <sequenceFlow id="flow5" sourceRef="usertask2" targetRef="usertask4"></sequenceFlow>    <sequenceFlow id="flow6" sourceRef="usertask3" targetRef="parallelgateway2"></sequenceFlow>    <sequenceFlow id="flow7" sourceRef="usertask4" targetRef="parallelgateway2"></sequenceFlow>    <endEvent id="endevent1" name="End"></endEvent>    <sequenceFlow id="flow8" sourceRef="parallelgateway2" targetRef="endevent1"></sequenceFlow>  </process>  <bpmndi:BPMNDiagram id="BPMNDiagram_parallelGateWay">    <bpmndi:BPMNPlane bpmnElement="parallelGateWay" id="BPMNPlane_parallelGateWay">      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">        <omgdc:Bounds height="35.0" width="35.0" x="400.0" y="20.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="parallelgateway1" id="BPMNShape_parallelgateway1">        <omgdc:Bounds height="40.0" width="40.0" x="397.0" y="110.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="parallelgateway2" id="BPMNShape_parallelgateway2">        <omgdc:Bounds height="40.0" width="40.0" x="397.0" y="370.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">        <omgdc:Bounds height="55.0" width="105.0" x="260.0" y="170.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">        <omgdc:Bounds height="55.0" width="105.0" x="460.0" y="170.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">        <omgdc:Bounds height="55.0" width="105.0" x="260.0" y="263.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4">        <omgdc:Bounds height="55.0" width="105.0" x="460.0" y="263.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">        <omgdc:Bounds height="35.0" width="35.0" x="400.0" y="470.0"></omgdc:Bounds>      </bpmndi:BPMNShape>      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">        <omgdi:waypoint x="417.0" y="55.0"></omgdi:waypoint>        <omgdi:waypoint x="417.0" y="110.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">        <omgdi:waypoint x="417.0" y="150.0"></omgdi:waypoint>        <omgdi:waypoint x="312.0" y="170.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">        <omgdi:waypoint x="417.0" y="150.0"></omgdi:waypoint>        <omgdi:waypoint x="512.0" y="170.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">        <omgdi:waypoint x="312.0" y="225.0"></omgdi:waypoint>        <omgdi:waypoint x="312.0" y="263.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">        <omgdi:waypoint x="512.0" y="225.0"></omgdi:waypoint>        <omgdi:waypoint x="512.0" y="263.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">        <omgdi:waypoint x="312.0" y="318.0"></omgdi:waypoint>        <omgdi:waypoint x="417.0" y="370.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">        <omgdi:waypoint x="512.0" y="318.0"></omgdi:waypoint>        <omgdi:waypoint x="417.0" y="370.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">        <omgdi:waypoint x="417.0" y="410.0"></omgdi:waypoint>        <omgdi:waypoint x="417.0" y="470.0"></omgdi:waypoint>      </bpmndi:BPMNEdge>    </bpmndi:BPMNPlane>  </bpmndi:BPMNDiagram></definitions>

java代码

package com.activiti.test;import java.util.List;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;public class ParallelGateWayTest {    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();    /**     * 部署流程定义 启动流程实例     */    @Test    public void deploy() {        processEngine.getRepositoryService()//获取管理流程定义实例                .createDeployment()//获取部署实例,添加要部署的流程并部署//              .addClasspathResource("diagrams/exclusiveGateWay.png")//从classpath中加载,一次只能加载一个文件//              .addClasspathResource("diagrams/exclusiveGateWay.bpmn")                .addClasspathResource("diagrams/parallelGateWay.png")//从classpath中加载,一次只能加载一个文件                .addClasspathResource("diagrams/parallelGateWay.bpmn")                .name("网上购物流程")//添加部署的名称                .deploy();//部署//      ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("exclusiveGateWay");        ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("parallelGateWay");        System.out.println("流程定义的ID:" + pi.getProcessDefinitionId());        System.out.println("流程实例的ID:" + pi.getId());    }    /**     * 查询个人任务     */    @Test    public void queryPersonalTask() {        String assignee = "李四";        List<Task> list = processEngine.getTaskService()                .createTaskQuery()                .taskAssignee(assignee)                .list();        if (list != null && list.size() > 0) {            for (Task task : list) {                System.out.println("任务ID:" + task.getId());                System.out.println("任务名称:" + task.getName());                System.out.println("流程定义ID:" + task.getProcessDefinitionId());                System.out.println("流程实例ID:" + task.getProcessInstanceId());                System.out.println("执行对象ID:" + task.getExecutionId());                System.out.println("===========================================");            }        }    }    /**     * 完成任务:使用流程变量设置报销的金额,由流程自动判断应该执行的哪条连线     */    @Test    public void completeTask(){        String taskId = "122502";        processEngine.getTaskService()            .complete(taskId);        System.out.println("完成任务");    }}
0 0
原创粉丝点击