Activiti6.0 (cuatro) el uso de variables de proceso

Tabla de contenido

I. Introducción

2. Introducción a las variables de proceso

1. Establecer variables de proceso

2. Utilice variables de proceso en la línea de proceso

3. Almacenamiento de variables de proceso

4. Resumen de experiencia


I. Introducción

Las variables de proceso también son algo muy importante en el uso de procesos, principalmente responsables del rol de pasar parámetros comerciales, y su alcance solo es válido en la instancia de proceso actual, por lo que a menudo se usan para especificar el controlador de tareas de un determinado enlace. . Este artículo presenta brevemente la configuración, transferencia y adquisición de variables de proceso El proceso todavía se basa en el proceso de licencia de la serie tres.

2. Introducción a las variables de proceso

Primero observe un código de caso de proceso que se muestra a continuación:

    @Test
    public void variableDemoTest() {
        // 发布流程
        Deployment deployment = repositoryService.createDeployment().name("请假小流程").addClasspathResource("processes/vocationDemo.bpmn20.xml").deploy();

        // 启动一个流程实例,同时设置流程变量,可以通过在启动或完成任务的时候传递变量,当然也可以单独设置变量
        Map<String, Object> variableMap = new HashMap<>();
        // 基本类型的变量在activiti中可直接存储
        variableMap.put("userId", "123");
        variableMap.put("leaveDays", 3);
        variableMap.put("leaveTime", new Date());
        // 对象以流的方式存储,包括javabean类型(必须实现序列化接口)
        variableMap.put("users", Lists.newArrayList("zhangsan"));
        variableMap.put("user", new User("李四"));
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vocation", variableMap);

        // 查询所有任务
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();

        System.out.println("Task size:" + tasks.size());

        Task task = tasks.get(0);

        // 也可以为某个任务单独设置变量,单独设置变量在实际中其实不建议存储到activiti中,由业务方自行存储比较好
        taskService.setVariable(task.getId(), "当前任务处理人", task.getAssignee());

        // 获取变量
        System.out.println("直属经理任务处理人" + taskService.getVariable(task.getId(), "当前任务处理人"));
    }

1. Establecer variables de proceso

Hay aproximadamente dos tipos de variables de proceso de configuración:

  • Ajuste variable de tipo básico
  • configuración de la variable javaBean

Y las variables de proceso se utilizan generalmente en la etapa de inicio, flujo o finalización del proceso, con el fin de pasar ciertos parámetros comerciales para que estas variables se puedan obtener en el oyente comercial para completar las propias necesidades del lado comercial, por lo tanto, configure las variables del proceso por separado en Activiti. De hecho, no se recomienda, es decir, la forma de establecer variables mediante taskService generalmente la implementa el lado empresarial.

2. Utilice variables de proceso en la línea de proceso

Otro uso de las variables de proceso es actuar en la línea de proceso. Cuando hay varias líneas de salida en un determinado enlace, Activiti necesita saber a qué línea ir. En este momento, las variables de proceso deben usarse en línea para determinar la dirección del flujo. Lo siguiente es para demostración. Se construirá un nuevo proceso de licencia y el diagrama de flujo dibujado con la aplicación Activiti es el siguiente:

Se puede observar que existen dos líneas de aprobación para el proceso de aprobación del gerente directo. Cuando la baja es mayor a tres días, se requiere la aprobación del gerente general, de lo contrario se puede dar por terminado directamente. Para este tipo de líneas múltiples, podemos establecer condiciones variables en la línea de proceso para cumplir, haga clic en la línea de proceso de pedir licencia por más de tres días, y luego configurar las condiciones de ejecución correspondientes, de la siguiente manera:

$ {} es un formato específico, el contenido en el medio debe usar una expresión de tipo booleano para determinar la conexión que se ejecutará, nextBranch es el nombre de la variable de proceso especificada. Luego, guarde el proceso actual y exporte el archivo xml. Para su conveniencia, el archivo xml se proporciona de la siguiente manera:

<?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/processdef">
  <process id="vocation" name="多分支请假流程" isExecutable="true">
    <startEvent id="startEvent1"></startEvent>
    <userTask id="sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896" name="直属经理审批" activiti:candidateUsers="test">
      <extensionElements>
        <modeler:user-info-firstname-test xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:user-info-firstname-test>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-D3C4F10F-0829-4168-8AF4-40B7FF375217" sourceRef="startEvent1" targetRef="sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896"></sequenceFlow>
    <userTask id="sid-32EDE0A5-D28C-474B-86F0-E0221DD5D26E" name="总经理审批" activiti:candidateUsers="test">
      <extensionElements>
        <modeler:user-info-firstname-test xmlns:modeler="http://activiti.com/modeler"><![CDATA[test]]></modeler:user-info-firstname-test>
        <modeler:activiti-idm-candidate-user xmlns:modeler="http://activiti.com/modeler"><![CDATA[true]]></modeler:activiti-idm-candidate-user>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
    </userTask>
    <endEvent id="sid-5879817C-644B-4A5E-86B8-16ED025C91AF"></endEvent>
    <sequenceFlow id="sid-FFBFCF5B-5B4D-420A-8D82-06506D546993" sourceRef="sid-32EDE0A5-D28C-474B-86F0-E0221DD5D26E" targetRef="sid-5879817C-644B-4A5E-86B8-16ED025C91AF"></sequenceFlow>
    <sequenceFlow id="sid-A37138F4-6D40-4EB7-961A-0242D63D8F9D" name="请假超过三天" sourceRef="sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896" targetRef="sid-32EDE0A5-D28C-474B-86F0-E0221DD5D26E">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${nextBranch=='超过三天'}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-D371A73D-E97E-45D3-ABEE-48221B30BBC0" name="请假天数较短" sourceRef="sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896" targetRef="sid-5879817C-644B-4A5E-86B8-16ED025C91AF">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${nextBranch=='三天以内'}]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_vocation">
    <bpmndi:BPMNPlane bpmnElement="vocation" id="BPMNPlane_vocation">
      <bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
        <omgdc:Bounds height="30.0" width="30.0" x="120.0" y="163.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896" id="BPMNShape_sid-042D76FB-6812-4099-A8E1-3CCC4A8D1896">
        <omgdc:Bounds height="80.0" width="100.0" x="240.0" y="140.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-32EDE0A5-D28C-474B-86F0-E0221DD5D26E" id="BPMNShape_sid-32EDE0A5-D28C-474B-86F0-E0221DD5D26E">
        <omgdc:Bounds height="80.0" width="100.0" x="405.0" y="30.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="sid-5879817C-644B-4A5E-86B8-16ED025C91AF" id="BPMNShape_sid-5879817C-644B-4A5E-86B8-16ED025C91AF">
        <omgdc:Bounds height="28.0" width="28.0" x="585.0" y="164.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="sid-D3C4F10F-0829-4168-8AF4-40B7FF375217" id="BPMNEdge_sid-D3C4F10F-0829-4168-8AF4-40B7FF375217">
        <omgdi:waypoint x="149.99875145663177" y="178.19353227685977"></omgdi:waypoint>
        <omgdi:waypoint x="240.0" y="179.35483870967744"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-D371A73D-E97E-45D3-ABEE-48221B30BBC0" id="BPMNEdge_sid-D371A73D-E97E-45D3-ABEE-48221B30BBC0">
        <omgdi:waypoint x="340.0" y="179.67637540453075"></omgdi:waypoint>
        <omgdi:waypoint x="585.000293242847" y="178.09061298871944"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-FFBFCF5B-5B4D-420A-8D82-06506D546993" id="BPMNEdge_sid-FFBFCF5B-5B4D-420A-8D82-06506D546993">
        <omgdi:waypoint x="505.0" y="107.5"></omgdi:waypoint>
        <omgdi:waypoint x="587.8" y="169.6"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="sid-A37138F4-6D40-4EB7-961A-0242D63D8F9D" id="BPMNEdge_sid-A37138F4-6D40-4EB7-961A-0242D63D8F9D">
        <omgdi:waypoint x="340.0" y="146.66666666666666"></omgdi:waypoint>
        <omgdi:waypoint x="405.0" y="103.33333333333333"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

Luego, como en el código anterior, asigne diferentes valores a la variable nextBranch para ver el efecto:

@Test
    public void multiBranchDemoTest() {
        // 1、发布流程
        Deployment deployment = repositoryService.createDeployment().name("多分支请假流程").addClasspathResource("processes/vocationDemo2.bpmn20.xml").deploy();

        // 2、启动一个流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vocation");

        // 3、查询所有任务
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();

        Task task = tasks.get(0);
        // 4、完成直属经理审批环节任务的同时设置流程变量,来告诉Activiti该走哪条线
        Map<String, Object> variables = new HashMap<>();
        variables.put("nextBranch", "超过三天");
        taskService.complete(task.getId(), variables);
    }

Puede ver que la instancia de proceso actual en la tabla de tareas en ejecución act_ru_task se transfiere automáticamente al enlace de aprobación del gerente general.

Cambie el valor de nextBranch a "dentro de tres días" y la circulación directa finaliza en este momento.

Cuando el valor de la variable de proceso no puede coincidir con el valor definido en todas las líneas de proceso, se generará un error. Por lo tanto, en el uso comercial real, el valor generalmente se establece como el ID de la línea de proceso. Por supuesto, la configuración del La línea de proceso también admite la selección de si es la línea predeterminada, es decir, la línea de proceso se ejecuta cuando no se cumplen las condiciones, pero generalmente no se establece excepto para juzgar múltiples líneas salientes en diferentes enlaces de la puerta de enlace.

 

3. Almacenamiento de variables de proceso

Las variables de proceso de Activiti se almacenan básicamente en la tabla act_ru_variable. Las seis variables anteriores se almacenan en la tabla de la siguiente manera:

Se puede ver que los tipos de variables de los tipos básicos se retienen y los tipos de javaBean se almacenan en una secuencia, por lo que javeBean debe implementar la interfaz de serialización, y los datos específicos se almacenan en act_ge_bytearray en modo binario, y lo siguiente Se utilizan como asociaciones 7509 y 7512. En el campo, puede ver que el contenido de la tabla act_ge_bytearray es el siguiente:

Si necesita configurar variables durante el flujo del proceso, se recomienda almacenar las variables en la propia tabla del lado comercial para distinguirla de Activiti, por ejemplo, es necesario configurar variables en la línea de proceso.

4. Resumen de experiencia

De lo anterior, se puede encontrar que para esas variables javaBean, Activiti se almacena en la tabla act_ge_bytearray, por lo que en el proceso de uso de variables de proceso, no almacene demasiadas variables grandes en Activiti; de lo contrario, de día y de noche, Activiti es consultas El rendimiento de esta tabla se verá afectado en gran medida, y todo el aspecto comercial también se verá afectado.

Supongo que te gusta

Origin blog.csdn.net/m0_38001814/article/details/104179729
Recomendado
Clasificación