Directorio de artículos
Introducción
Declaración de derechos de autor: Este artículo es parte del artículo original del blogger de CSDN "Sima Cylinder smashed", siguiendo el acuerdo de derechos de autor CC 4.0 BY-SA. Adjunte el enlace de la fuente original y esta declaración para reimprimir.
Enlace original
Definición de evento de error
El evento de error se desencadena por el error especificado.
Evento de límite de error
Introducción
El evento de límite de error se adjunta a una determinada actividad de proceso y se utiliza para capturar errores lanzados en el proceso. Generalmente se utiliza para incrustar subprocesos o llamar a subprocesos. El evento de límite de error recibirá la señal de error. Al establecer la propiedad errorRef, si esta propiedad no se utiliza, el evento de límite de error capturará cualquier evento de error sin generar el código de error.
Diagrama de flujo de diseño
Después de que un nodo de servicio lanza una excepción, se entrega al nodo de usuario para su procesamiento.
Configuración de la
clase de clase de tarea de servicio que genera una excepción
package com.yb.activiti6.error;
import org.activiti.engine.delegate.BpmnError;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
import java.io.Serializable;
/**
* @version 1.0
* @date 2020/7/29
*/
public class ErrorBoundaryDelegate implements JavaDelegate, Serializable {
@Override
public void execute(DelegateExecution delegateExecution) {
String errorCode = "aaa";
System.out.println("抛出错误errorCode:"+ errorCode);
throw new BpmnError(errorCode);
}
}
Configuración del evento de límite de error
Descripción: Establecer el
código de error en "aaa" significa que el evento de límite de error capturará la excepción con el código de error "aaa".
Procesar archivo bpmn
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1595988588536" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<error errorCode="aaa" id="ERR_1" name="主动抛出的异常"/>
<process id="error" isClosed="true" isExecutable="true" name="Error" processType="None">
<startEvent id="_2" name="开始"/>
<serviceTask activiti:class="com.yb.activiti6.error.ErrorBoundaryDelegate" activiti:exclusive="true" id="_3" name="服务任务"/>
<endEvent id="_4" name="结束"/>
<userTask activiti:assignee="errorUser" activiti:exclusive="true" id="_5" name="ErrorTask"/>
<sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
<boundaryEvent attachedToRef="_3" cancelActivity="true" id="_7" name="BoundaryEvent">
<errorEventDefinition errorRef="ERR_1" id="_7_ED_1"/>
</boundaryEvent>
<sequenceFlow id="_8" sourceRef="_7" targetRef="_5"/>
<sequenceFlow id="_9" sourceRef="_3" targetRef="_4"/>
</process>
<bpmndi:BPMNDiagram documentation="background=#000000;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
<bpmndi:BPMNPlane bpmnElement="error">
<bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">
<omgdc:Bounds height="32.0" width="32.0" x="-10.0" y="265.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3">
<omgdc:Bounds height="72.0" width="95.0" x="250.0" y="250.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="72.0" width="95.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_4" id="Shape-_4">
<omgdc:Bounds height="32.0" width="32.0" x="530.0" y="265.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5">
<omgdc:Bounds height="55.0" width="85.0" x="260.0" y="430.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="_7" id="Shape-_7">
<omgdc:Bounds height="32.0" width="32.0" x="285.0" y="290.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_2" targetElement="_3">
<omgdi:waypoint x="22.0" y="281.0"/>
<omgdi:waypoint x="250.0" y="286.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="_7" targetElement="_5">
<omgdi:waypoint x="301.0" y="322.0"/>
<omgdi:waypoint x="301.0" y="430.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9" sourceElement="_3" targetElement="_4">
<omgdi:waypoint x="345.0" y="286.0"/>
<omgdi:waypoint x="530.0" y="281.0"/>
<bpmndi:BPMNLabel>
<omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
Clase de prueba
package com.yb.activiti6;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.List;
/**
* @author [email protected]
* @version 1.0
* @date 2020/7/23
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiDemoTest09 {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngine processEngine;
@Autowired
private HistoryService historyService;
/**
* 发布流程,测试错误边界事件
* @throws IOException
*/
@Test
public void deploymentProcesses_zip(){
Deployment deploy = repositoryService.createDeployment()
.name("测试-错误边界事件-1")//创建流程名称
.addClasspathResource("processes/activiti_error.bpmn")//指定zip完成部署
.addClasspathResource("processes/activiti_error.png")
.deploy();
System.out.println("部署id:"+deploy.getId());
System.out.println("部署名称:"+deploy.getName());
}
/**
* 启动流程,测试错误边界事件
*/
@Test
public void startProcess() throws InterruptedException{
//可根据id,key,message启动流程
ProcessInstance parallel = runtimeService.startProcessInstanceByKey("error");
System.out.println("流程实例id:"+parallel.getId());
System.out.println("流程定义id:"+parallel.getProcessDefinitionId());
//睡一会
Thread.sleep(1000 * 5);
System.out.println("========================================================");
List<Task> list = taskService.createTaskQuery().taskAssignee("errorUser").list();
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("任务委派人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
}
}
/**
* 查看任务
*/
@Test
public void queryTask(){
List<Task> taskList = taskService.createTaskQuery() // 创建任务查询
.taskAssignee("errorUser") // 指定某个人
.list();
for (Task task : taskList) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("任务委派人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
}
}
/**
* 提交任务
*/
@Test
public void completeTask2(){
String taskId = "2508";
taskService.complete(taskId);
}
}
Efecto: La
tarea de servicio arroja un código de error "aaa" y el evento de límite de error llega al nodo del usuario después de ser capturado. La
consola es la siguiente.
Tarea de base de datos por completar (ErrorTask)