Flowable学习笔记(二):flowable实战

news2025/1/12 0:58:49

1.定义流程模板

(1)Call Activity(调用活动)

在这个流程图中,定义了一个开始节点、调用活动节点和结束节点(bpmn.xml文件在文章最后附上)。
开始节点:定义了一个执行监听器(commonStartExecutionListener)
调用活动节点:被调用元素(Call Element)指定了要调用的流程TestSubProcess,定义了一个执行监听器(callActivityStartExecutionListener)
结束节点:定义了一个执行监听器(commonEndExecutionListener)
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

(2)Sub Process(子流程)和User Task(用户任务)

在这个流程图中,定义了开始节点、子流程节点、用户任务节点和结束节点(bpmn.xml文件在文章最后附上)。
子流程节点:定义了一个执行监听器(subProcessExecutionListener)
用户任务节点:定义了一个执行监听器(commonExecutionListener)和一个任务监听器(commonTaskListener)
在这里插入图片描述

2.监听器

我这里定义的执行监听器和用户监听器只是打印了一些信息,没有太大的区别,在真正生产项目,是需要根据业务场景定制的。

(1)开始节点执行监听器
package gdut.listener;

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;

@Component("commonStartExecutionListener")
public class CommonStartExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        //流程实例ID
        String processInstanceId = delegateExecution.getProcessInstanceId();
        String rootProcessInstanceId = delegateExecution.getRootProcessInstanceId();

        System.out.println("CommonStartExecutionListener start");
        System.out.println("CommonStartExecutionListener processInstanceId is:" + processInstanceId);
        System.out.println("CommonStartExecutionListener taskId is:" + delegateExecution.getId());
        System.out.println("CommonStartExecutionListener rootProcessInstanceId is:" + rootProcessInstanceId);
        System.out.println("CommonStartExecutionListener stepCode is:" + delegateExecution.getCurrentActivityId());
    }
}
(2)调用活动节点执行监听器
package gdut.listener;

import gdut.constant.FlowableParameterKeyConstants;
import gdut.util.ExecutionSubTask;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component("callActivityStartExecutionListener")
public class CallActivityStartExecutionListener implements ExecutionListener {

    @Autowired
    private ExecutionSubTask executionSubTask;

    @Autowired
    private RuntimeService runtimeService;

    @Override
    public void notify(DelegateExecution delegateExecution) {
        System.out.println("CallActivityStartExecutionListener start");
        System.out.println("CallActivityStartExecutionListener processInstanceId is:" + delegateExecution.getProcessInstanceId());
        System.out.println("CallActivityStartExecutionListener taskId is:" + delegateExecution.getId());
        System.out.println("CallActivityStartExecutionListener rootProcessInstanceId is:" + delegateExecution.getRootProcessInstanceId());
        System.out.println("CallActivityStartExecutionListener stepCode is:" + delegateExecution.getCurrentActivityId());


        String realseTask = executionSubTask.getRealseTaskIdFromItem(delegateExecution);

        Map<String, Object> localCodeMap = new HashMap<>();
        String localCode = delegateExecution.getCurrentActivityId();
        localCodeMap.put("psopCode", localCode);
        localCodeMap.put(FlowableParameterKeyConstants.RELATIVE_TASK_ID + localCode, realseTask);
        runtimeService.setVariablesLocal(delegateExecution.getId(), localCodeMap);
    }
}
(3)子流程节点执行监听器
package gdut.listener;

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;

@Component("subProcessExecutionListener")
public class SubProcessExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        System.out.println("SubProcessExecutionListener start");
        System.out.println("SubProcessExecutionListener processInstanceId is:" + delegateExecution.getProcessInstanceId());
        System.out.println("SubProcessExecutionListener taskId is:" + delegateExecution.getId());
        System.out.println("SubProcessExecutionListener rootProcessInstanceId is:" + delegateExecution.getRootProcessInstanceId());
        System.out.println("SubProcessExecutionListener stepCode is:" + delegateExecution.getCurrentActivityId());
    }
}
(4) 用户任务执行监听器
package gdut.listener;

import org.flowable.bpmn.model.Process;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class CommonExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {

        //获取流程定义
        Process process = ProcessDefinitionUtil.getProcess(delegateExecution.getProcessDefinitionId());
        String processDefinitionKey = process.getId();

        //获取流程变量
        //Map<String, Object> variables = delegateExecution.getVariables();
        //delegateExecution.setVariablesLocal();

        System.out.println("CommonExecutionListener start");
        System.out.println("CommonExecutionListener processInstanceId is:" + delegateExecution.getProcessInstanceId());
        System.out.println("CommonExecutionListener taskId is:" + delegateExecution.getId());
        System.out.println("CommonExecutionListener rootProcessInstanceId is:" + delegateExecution.getRootProcessInstanceId());
        System.out.println("CommonExecutionListener stepCode is:" + delegateExecution.getCurrentActivityId());

    }
}
(5) 用户任务用户监听器
package gdut.listener;

import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class CommonTaskListener implements TaskListener {

    @Autowired
    RuntimeService runtimeService;

    @Override
    public void notify(DelegateTask delegateTask) {
        //执行器临时变量
        Map<String, Object> variables = runtimeService.getVariablesLocal(delegateTask.getExecutionId());

        System.out.println("CommonTaskListener start");
        System.out.println("CommonTaskListener processInstanceId is:" + delegateTask.getProcessInstanceId());
        System.out.println("CommonTaskListener taskId is:" + delegateTask.getId());
        System.out.println("CommonTaskListener executionId is:" + delegateTask.getExecutionId());
        System.out.println("CommonTaskListener stepCode is:" + delegateTask.getName());

    }
}
(6)结束节点执行监听器
package gdut.listener;

import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;

@Component("commonEndExecutionListener")
public class CommonEndExecutionListener implements ExecutionListener {

    @Override
    public void notify(DelegateExecution delegateExecution) {
        System.out.println("CommonEndExecutionListener end");
        System.out.println("CommonEndExecutionListener processInstanceId is:" + delegateExecution.getProcessInstanceId());
        System.out.println("CommonEndExecutionListener taskId is:" + delegateExecution.getId());
        System.out.println("CommonEndExecutionListener rootProcessInstanceId is:" + delegateExecution.getRootProcessInstanceId());
        System.out.println("CommonEndExecutionListener stepCode is:" + delegateExecution.getCurrentActivityId());

    }
}

3.部署流程定义、创建流程实例

我创建了一个Controller用于以Http请求的方式部署流程定义、创建流程实例

package gdut.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import gdut.entity.CreateInstanceParam;
import gdut.entity.ParamItem;
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Map;

@RestController
@RequestMapping("/flowable")
public class FlowableController {

    @Autowired
    private ProcessEngine processEngine;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    //部署流程定义
    @PostMapping("/deployFlowDefinition")
    public String deployDefinition(@RequestParam("fileName")String fileName) {
        Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource(fileName)
                .deploy();
        ProcessDefinition processDefinition = processEngine.getRepositoryService().createProcessDefinitionQuery()
                .deploymentId(deployment.getId())
                .singleResult();
        return "Found process definition : " + processDefinition.getName();
    }


    //创建流程实例
    @PostMapping("/createFlowInstance")
    public String createFlowInstance(@RequestBody CreateInstanceParam createInstanceParam) {
        String flowDefinitionName = createInstanceParam.getFlowDefinitionName();
        Map<String, Object> paramsMap = BeanUtil.beanToMap(createInstanceParam);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(flowDefinitionName, paramsMap);
        System.out.println("createFlowInstance instanceId is:" + processInstance.getProcessInstanceId());
        return processInstance.getProcessInstanceId();
    }

	//提交用户任务
    @PostMapping("/completeTaskId")
    public String completeTaskId(@RequestParam("taskId")String taskIds) {
        String[] taskIdArray = taskIds.split(",");
        for (int i = 0; i < taskIdArray.length; i++) {
            taskService.complete(taskIdArray[i]);
        }

        return "success";
    }

}

关联的一些实体类(注意要序列化,不然会报错):

package gdut.entity;

import lombok.Data;

@Data
public class CreateInstanceParam implements Serializable {

    private String flowDefinitionName;

    private ParamItem item;

}

package gdut.entity;

import lombok.Data;

@Data
public class ParamItem implements Serializable {

    private String name;
    private int age;
    private int salary;

}

4.测试

根据文件名称部署流程定义:
http://localhost:8081/flowable/deployFlowDefinition?fileName=TestCallActivity.bpmn20.xml
http://localhost:8081/flowable/deployFlowDefinition?fileName=TestSubProcess.bpmn20.xml

创建流程实例
http://localhost:8081/flowable/createFlowInstance
{
“flowDefinitionName”:“TestCallActivity”,
“item”:{
“name”:“liufeifei”,
“age”:1,
“salary”:100000
}
}

打印输出:

CommonStartExecutionListener start
CommonStartExecutionListener processInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CommonStartExecutionListener taskId is:034df127-85f3-11ed-a505-c03c5949a6ca
CommonStartExecutionListener rootProcessInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CommonStartExecutionListener stepCode is:callActivityStart
CallActivityStartExecutionListener start
CallActivityStartExecutionListener processInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CallActivityStartExecutionListener taskId is:034df127-85f3-11ed-a505-c03c5949a6ca
CallActivityStartExecutionListener rootProcessInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CallActivityStartExecutionListener stepCode is:testCallActivity
SubProcessExecutionListener start
SubProcessExecutionListener processInstanceId is:0372902d-85f3-11ed-a505-c03c5949a6ca
SubProcessExecutionListener taskId is:0372de51-85f3-11ed-a505-c03c5949a6ca
SubProcessExecutionListener rootProcessInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
SubProcessExecutionListener stepCode is:testSubProcess
CommonExecutionListener start
CommonExecutionListener processInstanceId is:0372902d-85f3-11ed-a505-c03c5949a6ca
CommonExecutionListener taskId is:03730563-85f3-11ed-a505-c03c5949a6ca
CommonExecutionListener rootProcessInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CommonExecutionListener stepCode is:testUserTask
CommonTaskListener start
CommonTaskListener processInstanceId is:0372902d-85f3-11ed-a505-c03c5949a6ca
CommonTaskListener taskId is:0373efc7-85f3-11ed-a505-c03c5949a6ca
CommonTaskListener executionId is:03730563-85f3-11ed-a505-c03c5949a6ca
CommonTaskListener stepCode is:测试用户任务
createFlowInstance instanceId is:03493632-85f3-11ed-a505-c03c5949a6ca

通过以上的输出可以发现:
a.开始节点和调用活动节点绑定的监听器的流程实例ID(processInstanceId)和根流程实例ID(rootProcessInstanceId)都是03493632-85f3-11ed-a505-c03c5949a6ca
b.子流程节点监听器和用户任务执行监听器的根流程实例ID与调用活动节点所在流程的流程实例ID是一致的。都是03493632-85f3-11ed-a505-c03c5949a6ca
c.子流程节点和用户任务节点有一个自己的流程实例ID 0372902d-85f3-11ed-a505-c03c5949a6ca
d.用户任务节点的任务监听器的执行ID(executionId)就是执行监听器的id。

注意此时并没有执行结束节点的监听器,为什么呢?因为当前流程还停留在用户任务节点,此时用户任务并没有被complete提交。

提交完成用户任务:
http://localhost:8081/flowable/completeTaskId?taskId=0373efc7-85f3-11ed-a505-c03c5949a6ca

用户任务节点提交后打印输出:

CommonEndExecutionListener end
CommonEndExecutionListener processInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CommonEndExecutionListener taskId is:034df127-85f3-11ed-a505-c03c5949a6ca
CommonEndExecutionListener rootProcessInstanceId is:03493632-85f3-11ed-a505-c03c5949a6ca
CommonEndExecutionListener stepCode is:callActivityEnd

通过以上的输出可以发现:
结束节点、开始节点和调用活动节点的流程实例ID、根流程实例ID是一致的。都是03493632-85f3-11ed-a505-c03c5949a6ca

bpmn文件

(1)TestCallActivity.bpmn20.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:flowable="http://flowable.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.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.7.2">
  <process id="TestCallActivity" name="TestCallActivity" isExecutable="true">
    <documentation>测试调用流程</documentation>
    <startEvent id="callActivityStart" name="调用子流程开始节点" flowable:formFieldValidation="true">
      <extensionElements>
        <flowable:executionListener event="start" delegateExpression="${commonStartExecutionListener}"></flowable:executionListener>
      </extensionElements>
    </startEvent>
    <endEvent id="callActivityEnd" name="调用子流程结束节点">
      <extensionElements>
        <flowable:executionListener event="start" delegateExpression="${commonEndExecutionListener}"></flowable:executionListener>
      </extensionElements>
    </endEvent>
    <callActivity id="testCallActivity" name="测试Call Activity" calledElement="TestSubProcess" flowable:calledElementType="key" flowable:fallbackToDefaultTenant="false">
      <extensionElements>
        <flowable:out source="item"></flowable:out>
        <flowable:executionListener event="start" delegateExpression="${callActivityStartExecutionListener}"></flowable:executionListener>
      </extensionElements>
    </callActivity>
    <sequenceFlow id="sid-4E847DF0-7B01-4A92-A840-B2022B1BC7FB" sourceRef="callActivityStart" targetRef="testCallActivity"></sequenceFlow>
    <sequenceFlow id="sid-7349C25C-5B30-4AD4-BA8B-AAD4CB723B15" sourceRef="testCallActivity" targetRef="callActivityEnd"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_TestCallActivity">
    <bpmndi:BPMNPlane bpmnElement="TestCallActivity" id="BPMNPlane_TestCallActivity">
      <bpmndi:BPMNShape bpmnElement="callActivityStart" id="BPMNShape_callActivityStart">
        <omgdc:Bounds height="30.0" width="30.0" x="100.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="callActivityEnd" id="BPMNShape_callActivityEnd">
        <omgdc:Bounds height="28.0" width="28.0" x="435.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="testCallActivity" id="BPMNShape_testCallActivity">
        <omgdc:Bounds height="80.0" width="100.0" x="240.0" y="64.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-4E847DF0-7B01-4A92-A840-B2022B1BC7FB" id="BPMNEdge_sid-4E847DF0-7B01-4A92-A840-B2022B1BC7FB" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="129.9497610449725" y="104.91428708430954"></omgdi:waypoint>
        <omgdi:waypoint x="239.99999999999892" y="104.28542857142855"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-7349C25C-5B30-4AD4-BA8B-AAD4CB723B15" id="BPMNEdge_sid-7349C25C-5B30-4AD4-BA8B-AAD4CB723B15" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
        <omgdi:waypoint x="339.95000000000005" y="104.0"></omgdi:waypoint>
        <omgdi:waypoint x="435.0" y="104.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

(2)TestSubProcess.bpmn20.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:flowable="http://flowable.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.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.7.2">
  <process id="TestSubProcess" name="TestSubProcess" isExecutable="true">
    <documentation>测试子流程</documentation>
    <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
    <subProcess id="testSubProcess" name="测试子流程">
      <extensionElements>
        <flowable:executionListener event="start" delegateExpression="${subProcessExecutionListener}"></flowable:executionListener>
      </extensionElements>
      <endEvent id="sid-6923D261-5D42-4399-9BD8-E4793D0FB7A7"></endEvent>
      <startEvent id="sid-0C5D0031-05EC-4CB3-A9E9-DBD0EF288ECE" flowable:formFieldValidation="true"></startEvent>
      <userTask id="testUserTask" name="测试用户任务" flowable:formFieldValidation="true">
        <extensionElements>
          <flowable:executionListener event="start" delegateExpression="${commonExecutionListener}"></flowable:executionListener>
          <flowable:taskListener event="create" delegateExpression="${commonTaskListener}"></flowable:taskListener>
        </extensionElements>
      </userTask>
      <sequenceFlow id="sid-DE014E83-3E40-4E19-9FDD-B39917E290AB" sourceRef="sid-0C5D0031-05EC-4CB3-A9E9-DBD0EF288ECE" targetRef="testUserTask"></sequenceFlow>
      <sequenceFlow id="sid-B2FF10B7-E8D3-478A-9F5A-7D451F17B75C" sourceRef="testUserTask" targetRef="sid-6923D261-5D42-4399-9BD8-E4793D0FB7A7"></sequenceFlow>
    </subProcess>
    <endEvent id="sid-CB5871B7-C75D-4C20-B2DA-41662DE32764"></endEvent>
    <sequenceFlow id="sid-903EBC2E-44F5-4F98-836D-625058E581D4" sourceRef="startEvent1" targetRef="testSubProcess"></sequenceFlow>
    <sequenceFlow id="sid-EA3427BF-E27A-4AA8-AF3A-0D92F8A146B2" sourceRef="testSubProcess" targetRef="sid-CB5871B7-C75D-4C20-B2DA-41662DE32764"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_TestSubProcess">
    <bpmndi:BPMNPlane bpmnElement="TestSubProcess" id="BPMNPlane_TestSubProcess">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="75.0" y="96.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="testSubProcess" id="BPMNShape_testSubProcess">
        <omgdc:Bounds height="163.0" width="556.0" x="195.0" y="29.5"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-6923D261-5D42-4399-9BD8-E4793D0FB7A7" id="BPMNShape_sid-6923D261-5D42-4399-9BD8-E4793D0FB7A7">
        <omgdc:Bounds height="28.0" width="28.0" x="525.0" y="97.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-0C5D0031-05EC-4CB3-A9E9-DBD0EF288ECE" id="BPMNShape_sid-0C5D0031-05EC-4CB3-A9E9-DBD0EF288ECE">
        <omgdc:Bounds height="30.0" width="30.0" x="236.0" y="96.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="testUserTask" id="BPMNShape_testUserTask">
        <omgdc:Bounds height="80.0" width="100.0" x="340.0" y="71.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-CB5871B7-C75D-4C20-B2DA-41662DE32764" id="BPMNShape_sid-CB5871B7-C75D-4C20-B2DA-41662DE32764">
        <omgdc:Bounds height="28.0" width="28.0" x="810.0" y="97.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-EA3427BF-E27A-4AA8-AF3A-0D92F8A146B2" id="BPMNEdge_sid-EA3427BF-E27A-4AA8-AF3A-0D92F8A146B2" flowable:sourceDockerX="278.00000000000006" flowable:sourceDockerY="81.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
        <omgdi:waypoint x="750.9499999999316" y="111.0"></omgdi:waypoint>
        <omgdi:waypoint x="810.0" y="111.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-B2FF10B7-E8D3-478A-9F5A-7D451F17B75C" id="BPMNEdge_sid-B2FF10B7-E8D3-478A-9F5A-7D451F17B75C" flowable:sourceDockerX="50.0" flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
        <omgdi:waypoint x="439.9499999999877" y="111.0"></omgdi:waypoint>
        <omgdi:waypoint x="525.0" y="111.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-903EBC2E-44F5-4F98-836D-625058E581D4" id="BPMNEdge_sid-903EBC2E-44F5-4F98-836D-625058E581D4" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="278.0" flowable:targetDockerY="81.5">
        <omgdi:waypoint x="104.9499998753581" y="111.0"></omgdi:waypoint>
        <omgdi:waypoint x="195.0" y="111.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-DE014E83-3E40-4E19-9FDD-B39917E290AB" id="BPMNEdge_sid-DE014E83-3E40-4E19-9FDD-B39917E290AB" flowable:sourceDockerX="15.0" flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
        <omgdi:waypoint x="265.94999905413545" y="111.0"></omgdi:waypoint>
        <omgdi:waypoint x="340.0" y="111.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis】进一步理解choose、when、otherwise标签

choose、when、otherwise choose里面包含when、otherwise两个标签&#xff0c;choose是父标签&#xff0c;when和otherwise必须都要写在它里面 当 when 中有条件满足的时候&#xff0c;就会跳出 choose&#xff0c;即所有的 when 和 otherwise 条件中&#xff0c;只有一个会输…

半导体设备中制冷系统的压力和温度准确控制解决方案

摘要&#xff1a;针对半导体低温工艺中制冷系统在高压防护和温度控制中存在的问题&#xff0c;本文将提出一种更简便有效的解决方案。解决方案的核心是在晶片托盘上并联一个流量可调旁路&#xff0c;使制冷剂在流入晶片托盘之前进行部分短路。即通过旁路流量的变化调节流出晶片…

罗切斯特大学将研究未来执行军事任务的量子计算

罗切斯特大学的专家将开发受量子启发的求解器系统&#xff0c;以解决军事任务中的实际问题。 美国军事研究人员需要使用量子启发求解器系统的量子计算技术&#xff0c;将高性能计算性能提高至少两个数量级的新方法。于是&#xff0c;他们从纽约的罗切斯特大学找到了解决方案。美…

Akka 进阶(三)Route 路由

目录一 路由Actor二 Pool方式的方式创建路由三 Group方式创建路由消息可以通过多种方式送达目的地&#xff0c;比如tell、ask、forward等&#xff0c;这些方式是最常规也是最简单的&#xff0c;但是对于复杂的消息投递逻辑&#xff0c;比如轮询投递、随机投递、广播组等&#x…

IB课程预估分,请认真规划学习进程

近年受疫情影响&#xff0c;IB考试形式与分数情况&#xff0c;有不小的波动&#xff0c;年度出分依然吸引着众人目光。尤其明后年准备参加大考的同学&#xff0c;更关心实战难度和考试分数的变化趋势。 01预估分&#xff1a;严重被压低的预期分数 全球疫大环境下&#xff0c;IB…

合宙 ESP32C3 烧录 Micropython 后连接端口报错

合宙esp32c3 开发板烧录micropython 后连接VScode 或 Thonny报错&#xff1a; Device is busy or does not respond. 1. 原因&#xff1a; 烧录的micropython bin文件有问题。 问题参考&#xff1a; 链接: 合宙ESP32-C3 烧录Micropython报错入坑记 2. 解决办法&#xff1a…

H3C smart-link实验 C套拆解

H3C smart-link实验 C套拆解一、项目拓扑二、项目需求三、配置步骤1.vlan-trunk2.STP3.smart-link四、测试一、项目拓扑 二、项目需求 总部局域网内sw3进行双上行链路灵活备份&#xff0c;smart-link组1 引用实例1(绑定vlan10)的流量从经过sw1的链路通向出口路由器r1&#xff…

10个优秀的Python库,实用且有趣

序言 哈喽兄弟们&#xff0c;今天分享10个优秀的Python库&#xff0c;超级实用&#xff01; 为什么这么多人选择学习python?首先&#xff0c;python是一门全场景编程语言&#xff0c;对于初学编程的人而言&#xff0c;选择一门全场景编程语言是非常不错的选择;其次&#xff…

PHP aws-sdk-php文件存储的实现与应用

前言 最近项目需要用到对象存储&#xff0c;将所有上传文件&#xff0c;存储到BOS云存储上。在开发过程中&#xff0c;遇到一些小小的问题&#xff0c;做个简单记录。 功能实现 1 下载sdk&#xff08;以下两种方式&#xff0c;任选其一即可&#xff09; &#xff08;1&#…

手绘图说电子元器件-电阻,电容,电感

电阻器与电位器 电阻器是最基本的电子元件,电位器是最基本的可调电子元件,它们广泛应用在各种电子电路中。 电阻器 电阻器是限制电流的元件,通常简称为电阻,是一种最基本、最常用的电子元件,包括固定电阻器、可变电阻器、敏感电阻器等。 电阻器的主要参数有电阻值和额…

FFT(2)

DFT到FFT 这是DFT公式 对DFT代数变换 将DFT的计算&#xff0c;分为计数组和偶数组。 惊奇的发现&#xff1a;只需要改变WkNW_k^NWkN​的符号即可得到X&#xff08;k&#xff09;的另一半项数的结果。 得到FFT算法&#xff08;蝶形运算&#xff09; 惊奇的发现&#xff1…

docker安装教程,即学即会

docker教程&#xff1a; https://www.runoob.com/docker/docker-tutorial.html卸载docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker docker-client docker-client-latest docker-co…

maven打包缺少依赖异常eu.neilalexander:jnacl:jar:1.0.0 was not found in...解决

在Linux系统的服务器上使用脚本部署项目&#xff0c;脚本的逻辑是&#xff1a; 进入到工作空间的项目文件夹从SVN拉取最新代码命令svn up执行mvn clean执行mvn package进入jar包生成的target文件夹nohub java -jar xxxxx.jar >/dev/null 2>&1 & 在项目打包过程…

C++迭代器详解

思考一个问题&#xff1a;我们该如何遍历一个字符串呢&#xff1f; 方法一&#xff1a;正常遍历 string s1("hello"); for(size_t i 0;i<s1.size();i) {cout<<s1[i]<<" ";//[]是一个重载运算符&#xff0c;实际上调用了s1.operator[](i)…

【爬虫+数据清洗+可视化分析】用Python分析哔哩哔哩“阳了“的评论数据

目录 一、背景介绍 二、爬虫代码 爬虫部分不作讲解。 三、可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间分析-折线图 3.3.3 点赞数分布-直方图 3.3.4 评论内容-情感分布饼图 3.3.5 评论内容-词云图 三、演示视频 一、…

Ansible常用模块

ping模块 验证主机的连通性 [rootmonster1 ~]# ansible all -m ping 192.168.71.131 | SUCCESS > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong&q…

Java中mongodb指定DB通过aggregate聚合查询操作示例

目录 前言&#xff1a; 应用场景&#xff1a; 命令描述&#xff1a;​ 代码示例&#xff1a; 聚会查询&#xff1a; 数量查询&#xff1a; 前言&#xff1a; 大家都知道&#xff0c;mongodb是一个非关系型数据库&#xff0c;也就是说&#xff0c;mongodb数据库中的每张表…

node-express学习总结

项目搭建 1. 使用express提供的框架构建&#xff08;不需要&#xff09; 2. 从零开始&#xff08;推荐&#xff09;安装 初始化项目 npm init -y安装express npm install express1.express的基本使用 创建js文件 const express require(express) // 1&#xff0c;创建服…

SSL/TLS类安全漏洞及SLB安全漏洞问题

SSL/TLS类安全漏洞及SLB安全漏洞问题1 : 问题背景1.1、SSL/TLS类漏洞-Sweet32 攻击1.2、SSL/TLS类漏洞-弱密码套件2 : 解决思路2.1、学习SSL/TLS是什么2.2、安装检测工具2.3、升级OpenSSL2.4、调整加密算法3 : 总结3.1、比较环境的不同3.2、解决该问题3.3、相关资源1 : 问题背景…

创建进程与进程地址空间

目录 创建进程 进程地址空间 为什么要用虚拟地址呢&#xff1f; 什么是进程地址空间&#xff1f; 为什么要写时拷贝呢&#xff1f; 创建进程 前面提到使用fork可以创建子进程&#xff0c;现在介绍fork创建子进程的细节。 fork创建子进程的时候&#xff0c;子进程的内核数…