1. Introducción al flujo de trabajo
1.1 Concepto
Workflow consiste en automatizar la gestión de procesos de negocio a través de ordenadores. Resuelve principalmente "el proceso de transferencia automática de documentos, información o tareas entre múltiples participantes de acuerdo con algunas reglas predefinidas, para lograr un determinado objetivo comercial esperado o promover la realización de este objetivo".
1.2 Sistema de flujo de trabajo
Un sistema de software tiene la función de flujo de trabajo, lo llamamos sistema de flujo de trabajo, ¿cuál es la función de flujo de trabajo en un sistema? Es para automatizar la gestión del proceso comercial del sistema, por lo que el flujo de trabajo se basa en el proceso comercial, por lo que el núcleo de un sistema de software es básicamente el proceso comercial del sistema, y el flujo de trabajo es solo para ayudar en la gestión. del proceso de negocio. Incluso si no hay un sistema comercial de flujo de trabajo, se puede desarrollar y ejecutar, pero con el flujo de trabajo, los procesos comerciales se pueden administrar mejor y se puede mejorar la escalabilidad del sistema.
1.3 Industrias aplicables
Industria de bienes de consumo, industria manufacturera, industria de servicios de telecomunicaciones, industria de servicios financieros como seguros de valores bancarios, industria de servicios de logística, industria de servicios inmobiliarios, administración de propiedades, empresas comerciales de importación y exportación grandes y medianas, instituciones gubernamentales, institutos de investigación y servicios educativos Industrias, etc., especialmente Es una gran empresa multinacional y una empresa del grupo.
1.4 aplicación específica
1. Procesos comerciales clave: pedidos, procesamiento de cotizaciones, revisión de contratos, procesamiento de llamadas de clientes, gestión de la cadena de suministro, etc.
2. Gestión administrativa: solicitudes de viajes de negocios, solicitudes de horas extras, solicitudes de licencias, solicitudes de automóviles, solicitudes de suministros de oficina varios, solicitudes de compras, informes diarios y semanales, etc. Todos los formularios administrativos que originalmente se procesaban manualmente.
3. Gestión de personal: arreglo de capacitación de empleados, evaluación del desempeño, procesamiento de cambios de trabajo, gestión de información de archivos de empleados, etc.
4. Categorías financieras relacionadas: solicitud de pago, procesamiento de cuentas por cobrar, procesamiento de reembolso diario, reembolso de viaje de negocios, solicitud de presupuesto y plan, etc.
5. Categoría de servicio al cliente: gestión de la información del cliente, quejas de los clientes, procesamiento de solicitudes, gestión del servicio postventa, etc.
6. Categorías de servicios especiales: los procesos correspondientes de la serie ISO, los procesos correspondientes de gestión de calidad, la gestión de información de datos de productos, el procesamiento de declaraciones de aduanas para empresas comerciales, el procesamiento de seguimiento de carga para empresas de logística, etc., pueden estandarizarse automáticamente mediante software de flujo de trabajo para varias tareas que son completado de forma gradual y manual a través de formularios.
1.5 Implementación
Antes de que existiera un motor de flujo de trabajo dedicado, para lograr el control del proceso, generalmente usábamos el valor del campo de estado para rastrear el cambio del proceso. De esta forma, los usuarios con diferentes roles deciden si mostrar el registro a través del valor del campo de estado.
Para los registros que se pueden ver con permiso, el usuario actual decide si aprueba la operación calificada según su rol. Si califica, establezca un valor en el campo de estado para representar calificado; por supuesto, si no calificado, también se debe establecer un valor para representar no calificado.
Esta es la forma más primitiva. Si bien el control del proceso se logra a través del campo de estado, cuando nuestro proceso cambia, el código escrito de esta manera también debe ajustarse.
Entonces, ¿existe una forma profesional de lograr la gestión del flujo de trabajo? Y se puede lograr que después de que cambie el proceso comercial, nuestro programa no necesite cambiarse.Si se puede lograr este efecto, entonces la adaptabilidad de nuestro sistema comercial mejorará en gran medida.
Recomiende el tutorial más completo de código abierto y gratuito de Spring Boot:
2. Resumen de Activiti7
2.1 Introducción
Alfresco Software anunció el lanzamiento oficial del proyecto de código abierto de gestión de procesos empresariales (BPM) Activiti el 17 de mayo de 2010. Su arquitecto principal es Tom Baeyens, experto en gestión de procesos empresariales BPM Tom Baeyens es el arquitecto del jbpm original, y jbpm es un motor de flujo de trabajo muy famoso, por supuesto, activiti también es un motor de flujo de trabajo.
Activiti es un motor de flujo de trabajo. Activiti puede extraer los procesos comerciales complejos en el sistema comercial y definirlos utilizando el lenguaje de modelado especial BPMN2.0. Los procesos comerciales se ejecutan de acuerdo con los procesos predefinidos, y Activiti implementa los procesos del sistema. , reduciendo la carga de trabajo de los sistemas comerciales para la actualización y transformación del sistema debido a cambios en el proceso, mejorando así la solidez del sistema y reduciendo los costos de desarrollo y mantenimiento del sistema.
Sitio web oficial: https://www.activiti.org/
Versión experimentada:
La última versión: Activiti7.0.0.Beta
2.1.1 RPM
BPM (Business Process Management), es decir, la gestión de procesos comerciales, es una construcción estandarizada de procesos comerciales de extremo a extremo para mejorar continuamente la eficiencia empresarial de la organización. BPM está incluido en la educación de gestión empresarial común, como EMBA y MBA.
2.1.2 Software BPM
El software BPM es una herramienta de TI que promueve la integración y el ajuste de métodos y soluciones comerciales entre personas, entre personas y sistemas, y entre sistemas de acuerdo con los cambios en el entorno comercial de la empresa.
El modelado, la automatización, el control de la gestión y la optimización de todo el ciclo de vida de los procesos comerciales internos y externos de la empresa a través del software BPM pueden reducir el costo de la empresa y aumentar considerablemente las ganancias.
El software BPM es ampliamente utilizado en las empresas.Dondequiera que haya procesos comerciales, el software BPM se puede utilizar para la gestión, como la gestión de la oficina de personal de la empresa, la gestión del proceso de adquisición, la gestión del proceso de aprobación de documentos oficiales, la gestión financiera, etc.
2.1.3 BPMN
BPMN (Modelo y notación de procesos comerciales): el modelo y la notación de procesos comerciales es un conjunto de notaciones de modelado de procesos comerciales estándar desarrolladas por BPMI (Iniciativa de gestión de procesos comerciales), y los procesos comerciales se pueden crear utilizando las notaciones proporcionadas por BPMN.
La especificación BPMN1.0 se publicó en mayo de 2004. BPMI se incorporó a la organización OMG (The Object Management Group) en septiembre de 2005. OMG lanzó la versión final de BPMN2.0 en enero de 2011.
El historial de desarrollo específico es el siguiente:
BPMN es actualmente un estándar de BPM ampliamente aceptado por varios proveedores de BPM. Activiti utiliza BPMN 2.0 para el modelado de procesos y la gestión de ejecución de procesos e incluye muchos símbolos de modelado, como: Evento
Representado por un círculo, es algo que sucede durante la ejecución del proceso.
Las actividades se representan mediante rectángulos redondeados y un proceso consta de una o varias actividades.
El gráfico Bpmn en realidad representa el proceso comercial a través de xml, y el archivo .bpmn anterior se abre con un editor de texto:
<?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="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="创建请假单"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="部门经理审核"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<userTask id="usertask3" name="人事复核"></userTask>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="130.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="210.0" y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="360.0" y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="510.0" y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="660.0" y="160.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="315.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="360.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="465.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="510.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="615.0" y="177.0"></omgdi:waypoint>
<omgdi:waypoint x="660.0" y="177.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
2.2 Pasos para usar
desplegar actividades
Activiti es un motor de flujo de trabajo (de hecho, es un conjunto de API de paquetes jar). El sistema comercial puede acceder (operar) la interfaz de activiti para operar convenientemente los datos relacionados con el proceso, de modo que el entorno de flujo de trabajo se pueda integrar con el entorno. del sistema empresarial. .
definición de proceso
Utilice la herramienta de modelado de procesos activiti (diseñador de actividades) para definir procesos comerciales (archivos .bpmn).
El archivo .bpmn es el archivo de definición de procesos comerciales, que define el proceso comercial a través de xml.
Despliegue de definición de proceso
activiti implementa definiciones de procesos comerciales (archivos .bpmn).
Use la API proporcionada por activiti para almacenar el contenido de la definición del proceso y puede consultar el contenido definido durante la ejecución de Activiti
Activiti ejecuta y almacena el contenido de la definición del proceso en la base de datos
Iniciar una instancia de proceso
La instancia de proceso también se llama: ProcessInstance
Iniciar una instancia de proceso significa iniciar la operación de un proceso de negocio.
Una vez completada la implementación de la definición del proceso de licencia del empleado, si Zhang San desea solicitar una licencia, puede iniciar una instancia de proceso, y si Li Si desea solicitar una licencia, también puede iniciar una instancia de proceso y la ejecución de los dos procesos no se afectan entre sí.
Tareas pendientes de consulta de usuario (Tarea)
Debido a que el proceso de negocio del sistema ha sido entregado a activiti para su administración, a través de activiti, puede consultar dónde se ejecuta el proceso actual y qué tareas debe manejar el usuario actual. Estas actividades nos ayudan a administrarlas, sin necesidad de desarrolladores para escribir consultas en sentencias sql.
El usuario maneja las tareas
Después de que el usuario consulta las tareas pendientes, puede manejar una determinada tarea. Si la tarea se completa, otros usuarios deben manejarla. Por ejemplo, después de que se crea la orden de compra, el gerente del departamento la revisará. Este proceso es también completado por activiti para nosotros.
fin del proceso
Cuando se completa la tarea y no hay un nodo de tarea siguiente, la instancia de proceso se completa.
Tres, entorno Activiti
3.1 Entorno de desarrollo
- Jdk1.8 o superior
- Mysql 5 y superior
- Tomcat8.5
- IDEA
Nota: el complemento de la herramienta de definición de procesos de activiti se puede instalar en la herramienta IDEA o Eclipse
3.2 Entorno de actividad
Usamos: Activiti7.0.0.Beta1
spring5 es compatible de forma predeterminada.
Recomiende el tutorial más completo de código abierto y gratuito de Spring Boot:
3.2.1 Descargar actividad7
Dirección de descarga de Activiti: http://activiti.org/download.html
, las dependencias de Maven son las siguientes:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.0.0.Beta1</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
1) Base de datos:
El funcionamiento de activiti requiere el soporte de la base de datos, las bases de datos soportadas son: h2, mysql, oracle, postgres, mssql, db2.
3.2.2 Instalación bajo el diseñador de procesos IDEA
Busque el submenú "Configuración" en el menú Archivo de IDEA y luego seleccione el menú "complementos" a la izquierda, como se muestra en la siguiente figura:
En este punto podemos buscar el complemento actiBPM, que es Activiti Designer
la versión IDEA, y hacemos clic en Instalar para instalarlo.
Después de la instalación, la página es la siguiente:
Indica que la idea debe reiniciarse, haga clic en Reiniciar.
Una vez que se complete el reinicio, abra Complementos (lista de complementos) en Configuración nuevamente, haga clic en Instalado (complementos instalados) a la derecha, y si ve actiBPM en la lista, significa que se instaló correctamente, como se muestra a continuación. cifra:
En los siguientes cursos, utilizaremos este diseñador de procesos para el diseño de procesos de Activiti.
3.3 Soporte de base de datos de Activiti
Activiti necesita el soporte de la base de datos en tiempo de ejecución y utiliza 25 tablas para leer el contenido del nodo de definición del proceso en la tabla de la base de datos para su uso posterior.
3.3.1 Bases de datos compatibles con Activiti
Las bases de datos y versiones soportadas por activiti son las siguientes:
3.3.2 Generar tablas en MySQL
3.3.2.1 Crear base de datos
Crear actividades de base de datos mysql (cualquier nombre):
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
3.3.2.2 Usar código Java para generar tablas
- Crear un proyecto Java
Use idea para crear un proyecto maven de java, llamado: activiti01.
- Agregar coordenadas de dependencias maven (paquete jar)
Primero, debe agregar el paquete jar requerido por ProcessEngine al proyecto java, que incluye:
- actividades-motor-7.0.0.beta1.jar
- Los paquetes jar de los que depende la actividad: mybatis, alf4j, log4j, etc.
- El paquete de primavera del que depende la actividad
- controlador de base de datos mysql
- Grupo de conexiones de datos de terceros dbcp
- unidad-prueba-junit-4.12.jar
Usamos maven para construir el proyecto, por lo que las coordenadas correspondientes a estos frascos deben importarse al archivo pom.xml.
Las dependencias completas son las siguientes:
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 模型处理 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn json数据转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 布局 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- activiti 云支持 -->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 链接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
- Agregar configuración de registro log4j
Usamos el paquete de registro log4j, que puede configurar el registro
Crear log4j.properties en recursos
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=f:\act\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
- Agregar archivo de configuración de actividades
Usamos el método predeterminado proporcionado por activiti para crear tablas mysql.
El requisito del método predeterminado es crear activiti.cfg.xml
un archivo Nota: el directorio y el nombre de archivo del método predeterminado no se pueden modificar, porque el código fuente de activiti se ha configurado para leer archivos con un nombre de archivo fijo en un directorio fijo .
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
- Configurar en activiti.cfg.xml
activiti.cfg.xml
El método predeterminado debe ser el nombre del bean en el medio processEngineConfiguration
, y el nombre no se puede modificar
Aquí hay 2 métodos de configuración: uno es configurar la fuente de datos por separado y el otro es no configurar la fuente de datos por separado.
1. Configuración directaprocessEngineConfiguration
processEngineConfiguration
Se utiliza para crear ProcessEngine
, y la operación de la base de datos se realizará ProcessEngine
cuando .
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 默认id对应的值 为processEngineConfiguration -->
<!-- processEngine Activiti的流程引擎 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="123456"/>
<!-- activiti数据库表处理策略 -->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
2. Después de configurar la fuente de datos, processEngineConfiguration
consulte
Primero configure la fuente de datos
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 这里可以使用 链接池 dbcp-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///activiti" />
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
</bean>
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 引用数据源 上面已经设置好了-->
<property name="dataSource" ref="dataSource" />
<!-- activiti数据库表处理策略 -->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
- Programa de escritura de clase Java para generar tabla
Cree una clase de prueba, llame a la clase de herramienta de activiti y genere las tablas de base de datos que necesita acitivti.
El uso directo de la clase de herramienta proporcionada por activiti leerá los archivos ProcessEngines
debajo de classpath de forma predeterminada , leerá la configuración de la base de datos en él, creará y creará tablas automáticamente al crear .activiti.cfg.xml
ProcessEngine
ProcessEngine
el código se muestra a continuación:
package com.itheima.activiti01.test;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class TestDemo {
/**
* 生成 activiti的数据库表
*/
@Test
public void testCreateDbTable() {
//使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
}
ilustrar:
- Ejecute el segmento de programa anterior para completar la creación de la tabla de actividades e implemente diferentes estrategias de procesamiento de tablas de datos cambiando el valor del parámetro
activiti.cfg.xml
en .databaseSchemaUpdate
- Cuando se ejecuta el
getDefaultProcessEngine
método ,activiti.cfg.xml
encuentre un nombre fijo de élprocessEngineConfiguration
.
Durante la ejecución del programa de prueba, la consola de ideas generará registros, lo que indica que el programa está creando una tabla de datos, similar a la siguiente, preste atención al contenido de la línea roja:
Una vez completada la ejecución, verificamos la base de datos y creamos tablas 25. Los resultados son los siguientes:
En este punto, hemos completado la creación de la base de datos y las tablas necesarias para que se ejecuten las actividades.
3.4 Introducción a la estructura de la tabla
3.4.1 Reglas de nomenclatura y funciones de las tablas
Al ver la tabla recién creada, encontramos que todas las tablas de Activiti ACT_
comienzan con .
La segunda parte es una designación de dos letras que indica el propósito de la tabla. La finalidad también corresponde a la API del servicio.
ACT_RE
: 'RE' significa repositorio. Las tablas con este prefijo contienen definiciones de procesos y procesan recursos estáticos (imágenes, reglas, etc.).ACT_RU
: 'RU' significa tiempo de ejecución. Estas tablas de tiempo de ejecución contienen datos en ejecución, como instancias de procesos, tareas, variables, tareas asincrónicas, etc. Activiti solo guarda estos datos durante la ejecución de la instancia del proceso y elimina estos registros al final del proceso. De esta forma, la tabla de tiempo de ejecución siempre puede ser pequeña y rápida.ACT_HI
: 'HI' significa historia. Estas tablas contienen datos históricos como instancias de procesos históricos, variables, tareas, etc.ACT_GE
: GE significa general. Datos comunes, utilizados en diferentes escenarios
3.4.2 Introducción a la tabla de datos de actividad
Cuatro, diagrama de relación de clases de Activiti
Arriba, hemos completado la generación de la tabla de la base de datos de Activiti. En el código Java, llamamos a la clase de herramienta de Activiti. Comprendamos la relación de clase de Activiti.
4.1 Diagrama de clases
En la nueva versión, podemos encontrar a través de experimentos IdentityService
que FormService
ambos Servicios han sido eliminados.
Por lo tanto, no explicaremos estos dos Servicios más adelante, pero todavía existen estos dos Servicios en la versión anterior, los estudiantes deben comprender
4.2 activiti.cfg.xml
El archivo de configuración del motor de activiti incluye: ProcessEngineConfiguration
definición, definición de origen de datos, administrador de transacciones, etc. Este archivo es en realidad un archivo de configuración Spring.
4.3 Clase de configuración del motor de proceso
La clase de configuración del motor de procesos ( ProcessEngineConfiguration
), a través de la cual ProcessEngineConfiguration
se puede crear el motor de flujo de trabajo ProceccEngine
, los dos métodos comúnmente utilizados son los siguientes:
4.3.1 Configuración del motor de proceso independiente
El uso StandaloneProcessEngineConfigurationActiviti
puede ejecutarse solo, para crear ProcessEngine
, Activiti
manejará la transacción por sí mismo.
Método del archivo de configuración:
Por lo general, activiti.cfg.xml
un bean con una identificación processEngineConfiguration
de .
Métodos de la siguiente manera:
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--配置数据库相关的信息-->
<!--数据库驱动-->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<!--数据库链接-->
<property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
<!--数据库用户名-->
<property name="jdbcUsername" value="root"/>
<!--数据库密码-->
<property name="jdbcPassword" value="123456"/>
<!--actviti数据库表在生成时的策略 true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
También puede unirse al grupo de conexiones:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///activiti"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="3"/>
<property name="maxIdle" value="1"/>
</bean>
<!--在默认方式下 bean的id 固定为 processEngineConfiguration-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--引入上面配置好的 链接池-->
<property name="dataSource" ref="dataSource"/>
<!--actviti数据库表在生成时的策略 true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
4.3.2 Configuración de SpringProcessEngine
A través de org.activiti.spring.SpringProcessEngineConfiguration
la integración con Spring.
Cree un archivo de configuración integrado para spring y activiti:
activity-spring.cfg.xml
(el nombre puede ser modificado)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
<!-- 工作流引擎配置bean -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 使用spring事务管理器 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 数据库策略 -->
<property name="databaseSchemaUpdate" value="drop-create" />
<!-- activiti的定时任务关闭 -->
<property name="jobExecutorActivate" value="false" />
</bean>
<!-- 流程引擎 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
<!-- 资源服务service -->
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService" />
<!-- 流程运行service -->
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService" />
<!-- 任务管理service -->
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService" />
<!-- 历史管理service -->
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
<!-- 用户管理service -->
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />
<!-- 引擎管理service -->
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
<!-- 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/activiti" />
<property name="username" value="root" />
<property name="password" value="mysql" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes></tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面,根据具体项目修改切点配置 -->
<aop:config proxy-target-class="true">
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.itheima.ihrm.service.impl.*.(..))"* />
</aop:config>
</beans>
crearprocessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
activiti.cfg.xml
Debe haber un processEngineConfiguration
bean en el requisito de código anterior
También puede usar el siguiente método para cambiar el nombre del bean:
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
4.4 Creación del motor de flujo de trabajo
El motor de flujo de trabajo (ProcessEngine), que es equivalente a una interfaz de fachada, se ProcessEngineConfiguration
crea processEngine
al ProcessEngine
crear cada interfaz de servicio.
4.4.1 Método de creación predeterminado
El nombre del archivo y la ruta son fijos activiti.cfg.xml
, y hayactiviti.cfg.xml
configuraciones en el archivo , puede usar el siguiente código para crear :processEngineConfiguration
processEngine
//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
4.4.2 Método general de creación
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
4.5 Interfaz de servicio de servicio
El servicio es la interfaz de servicio proporcionada por el motor de flujo de trabajo para la implementación, ejecución y administración del flujo de trabajo. Usamos estas interfaces para ser las tablas de datos correspondientes a los servicios de operación.
4.5.1 Método de creación del servicio
Crear servicio a través de ProcessEngine
El camino es el siguiente:
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
4.5.2 Descripción general de los servicios
una breve introducción:
- Servicio de repositorio
Es la clase de gestión de recursos de activiti, que proporciona operaciones para gestionar y controlar paquetes de liberación de procesos y definiciones de procesos. Un diagrama de flujo empresarial diseñado con una herramienta de modelado de flujo de trabajo necesita usar este servicio para implementar el contenido del archivo de definición de proceso en la computadora.
Además de implementar definiciones de procesos, también puede: Consultar el paquete de versión y la definición de procesos en el motor.
Pausa o activa los paquetes de lanzamiento, correspondientes a todas las definiciones de proceso específicas. Suspender significa que ya no pueden realizar ninguna operación, activar es la operación inversa correspondiente. Acceso a diversos recursos, como archivos incluidos en el paquete de distribución o diagramas de flujo generados automáticamente por el motor.
Obtenga la versión pojo de la definición del proceso, que se puede usar para analizar el proceso a través de java en lugar de xml.
- RuntimeService
Clase de gestión de operaciones de procesos de Activiti. Puede obtener mucha información sobre la ejecución del proceso de esta clase de servicio
- Servicio de tareas
Clase de gestión de tareas de Activiti. La información de la tarea se puede obtener de esta clase.
- HistorialServicio
La clase de gestión de historial de Activiti puede consultar información histórica. Cuando se ejecuta el proceso, el motor guardará una gran cantidad de datos (de acuerdo con la configuración), como la hora de inicio de la instancia del proceso, los participantes de la tarea, el tiempo para completar la tarea, la ruta de ejecución de cada instancia de proceso, etc. esperar. Este servicio obtiene estos datos principalmente a través de la función de consulta.
- Servicio de Administracion
La clase de gestión del motor de Activiti proporciona funciones de gestión y mantenimiento para el motor de procesos de Activiti.Estas funciones no se utilizan en aplicaciones basadas en flujos de trabajo y se utilizan principalmente para el mantenimiento diario del sistema Activiti.
5. Primeros pasos con Activiti
En este capítulo, vamos a crear un flujo de trabajo de Activiti e iniciar el proceso.
La creación de un flujo de trabajo de Activiti incluye principalmente los siguientes pasos:
- Defina el proceso, de acuerdo con la especificación BPMN, use la herramienta de definición de procesos para describir todo el proceso con símbolos de proceso
- Implemente el proceso, cargue el archivo de definición de proceso dibujado en la base de datos y genere datos de tabla
- Inicie el proceso y use el código Java para manipular el contenido de la tabla de la base de datos
5.1 Símbolos de proceso
BPMN 2.0 es un acrónimo de Business Process Modeling Notation 2.0.
Fue creado y desarrollado continuamente por Business Process Management Initiative, una asociación sin fines de lucro. Como señal, BPMN 2.0 es un conjunto de especificaciones de notación que utilizan algunas notaciones para aclarar el diagrama de flujo del diseño de procesos comerciales, lo que puede mejorar la eficiencia de la comunicación durante el modelado comercial.
Actualmente, BPMN2.0 es la última versión, que se utiliza para el diseño y la comunicación visual en el contexto de BPM.
A continuación, primero comprendamos los símbolos comunes en el diseño de procesos.
El cumplimiento básico de BPMN2.0 incluye principalmente:
Evento Evento
Actividad Actividad
Actividad es un término general para trabajo o tarea. Una actividad puede ser una tarea o un subproceso del proceso actual; en segundo lugar, también puede especificar diferentes tipos para la actividad. Las actividades comunes son las siguientes:
GatewayGateWay
Las puertas de enlace se utilizan para procesar decisiones. Hay varias puertas de enlace de uso común que deben entenderse:
puerta de enlace exclusiva (x)
- Solo se elegirá un camino. Cuando el proceso se ejecuta en la puerta de enlace, se calcula uno por uno de acuerdo con el orden del flujo de salida, y cuando el resultado del cálculo de la condición es verdadero, continúa ejecutando el flujo de salida de la puerta de enlace actual;
- Si varias rutas se evalúan como verdaderas, se ejecuta la primera ruta verdadera. Si ninguna de las puertas de enlace se evalúa como verdadera, el motor genera una excepción.
- La puerta de enlace exclusiva debe usarse junto con el flujo de secuencia condicional. El atributo predeterminado especifica el flujo de secuencia predeterminado. Cuando no se cumplen todas las condiciones, se ejecutará el flujo de secuencia predeterminado.
Puerta de enlace paralela (+)
- todas las rutas se seleccionarán al mismo tiempo
- Dividir: ejecuta todos los flujos de secuencia de salida en paralelo, creando una línea de ejecución paralela para cada flujo de secuencia.
- Fusionar: todas las líneas que se separan de la puerta de enlace paralela y se ejecutan esperan aquí, hasta que se ejecutan todas las líneas antes de continuar con la ejecución hacia abajo.
Puerta de enlace inclusiva (+)
-- Se pueden ejecutar varias líneas al mismo tiempo, o se pueden establecer condiciones en la puerta de enlace
- Dividir: evalúe la expresión en cada línea, cuando la expresión se evalúe como verdadera, cree una línea paralela y continúe con la ejecución
- Fusionar: todas las líneas que se separan de la puerta de enlace paralela y se ejecutan esperan aquí, hasta que se ejecutan todas las líneas antes de continuar con la ejecución hacia abajo.
Pasarela de eventos (+)
—— Especialmente configurado para eventos de captura intermedios, lo que permite que varios flujos de salida apunten a varios eventos de captura intermedios diferentes. Cuando el proceso se ejecuta en la puerta de enlace de eventos, el proceso está en estado de espera y debe esperar a que se inicie un evento para convertir el estado de espera en un estado activo.
Flujo a flujo
Un flujo es un cable que conecta dos nodos de proceso. Las direcciones de flujo comunes incluyen lo siguiente:
5.2 Uso del Diseñador de procesos
Usos de Activiti-Designer
Paleta
Se puede usar después de instalar el complemento en idea, y el tablero de dibujo incluye los siguientes nodos:
- Conexión—conexión
- Evento—evento
- Tarea—tarea
- Puerta de enlace—puerta de enlace
- Contenedor—contenedor
- Evento de límite—Evento de límite
- Evento intermedio- - Evento intermedio
Después de diseñar el diagrama de flujo, guarde y genere un archivo .bpmn
Nuevo proceso (herramienta IDEA)
Primero seleccione el directorio donde se almacenan los gráficos (seleccione el directorio bpmn en recursos), haga clic en el menú: New -> BpmnFile
, como se muestra en la figura:
Aparece un cuadro como el que se muestra en la siguiente figura, ingrese evection para indicar el proceso de aprobación del viaje de negocios:
Después de nombrar el evento (la extensión predeterminada es bpmn), puede ver la página de diseño del proceso, como se muestra en la figura:
El área de la izquierda es el área de dibujo y el área de la derecha es el área de la paleta.
Haga clic en los elementos del tablero de dibujo con el mouse para dibujar en el lado izquierdo
proceso de dibujo
Usa la patineta para dibujar el proceso, arrastrando el icono de la tabla de dibujo de derecha a izquierda, el efecto final es el siguiente:
Especifique la clave de definición del proceso
La clave de definición del proceso es la identificación de la definición del proceso, y la clave del proceso se puede ver a través de la vista de propiedades
líder de tarea designado
Especifique la persona a cargo de cada nodo de tarea en la vista de propiedades, por ejemplo: la persona a cargo de completar la solicitud de viaje de negocios es zhangsan
- la persona a cargo de la aprobación del gerente es jerry
- El encargado de la aprobación por parte del gerente general es Jack
- La persona a cargo de la aprobación financiera es rosa.
6. Operación del proceso
6.1 Definición del proceso
descripción general
La definición del proceso consiste en describir el proceso comercial fuera de línea de acuerdo con el estándar bpmn2.0 y, por lo general, utiliza el complemento en la idea para modelar el proceso comercial.
Use el diseñador diseñador bajo la idea de dibujar el proceso y se generarán dos archivos: .bpmn y .png
archivo .bpmn
El uso de activiti-desinger para diseñar un proceso comercial generará un archivo .bpmn, sobre el cual hemos creado el archivo bpmn
El nodo raíz de BPMN 2.0 es el nodo de definiciones. En este elemento, se pueden definir múltiples definiciones de procesos (pero recomendamos que cada archivo contenga solo una definición de proceso, lo que puede simplificar la dificultad de mantenimiento durante el proceso de desarrollo).
Tenga en cuenta que el elemento de definiciones debe contener al menos las declaraciones de xmlns y targetNamespace. targetNamespace puede ser cualquier valor, se utiliza para clasificar la instancia del proceso.
- Parte de definición del proceso: define la descripción de cada nodo del proceso y el flujo del proceso entre nodos.
- Definición del diseño del proceso: defina información como las coordenadas de posición de cada nodo del proceso en el diagrama de flujo.
Generar archivo de imagen .png
Modo de operación en la herramienta IDEA
1. Modifique el sufijo del archivo a xml
Primero, cambie el nombre del archivo evection.bpmn a evection.xml, como se muestra a continuación:
Se modifica el archivo bpmn antes de evection.xml, el efecto es el siguiente:
2. Use el diseñador para abrir el archivo .xml
En el archivo evection.xml, haga clic con el botón derecho y seleccione el menú Diagramas, luego seleccioneShow BPMN2.0 Designer…
3. Ver archivos abiertos
Después de abrir, aparecen caracteres ilegibles, como se muestra en la figura:
4. Resuelva los caracteres ilegibles chinos
1. Abra Configuración, busque Codificaciones de archivos y seleccione UTF-8 para todas las opciones de codificación.
2. Abra la ruta de instalación de IDEA y busque el siguiente directorio de instalación
Depende de la versión que tenga instalada, estoy usando una idea de 64 bits, así que idea64.exe.vmoptions
agregue un comando en la última línea del archivo:-Dfile.encoding=UTF-8
Como sigue:
Tenga cuidado de no tener espacios, de lo contrario, IDEA no se abrirá cuando lo reinicie y luego reinicie IDEA.
Si el método anterior se ha completado y aún aparecen caracteres ilegibles, modifique otro archivo y agregue: al final del archivo -Dfile.encoding=UTF-8
, y luego reinicie idea, como se muestra en la figura:
Finalmente, en el archivo evection.xml, haga clic derecho y seleccione el menú Diagramas, y luego seleccione para Show BPMN2.0 Designer…
ver la imagen generada, como se muestra en la figura:
Hasta ahora, resuelve el problema distorsionado.
5. Exportar como archivo de imagen
Haga clic Export To File
en el ícono pequeño para abrir la siguiente ventana, preste atención para completar el nombre y la extensión del archivo y elija la ubicación para guardar la imagen:
Luego, copiamos el archivo png en el directorio bpmn en recursos y cambiamos el nombre de evection.xml a evection.bpmn.
6.2 Implementación de definición de procesos
descripción general
La implementación del proceso definido anteriormente en el diseñador en la base de datos de actividades es la implementación de la definición del proceso.
Agregue e implemente los archivos bpmn y png de la definición del proceso en activiti uno por uno llamando a la API de activiti, o empaquete los dos archivos en un paquete zip para su implementación.
implementación de un solo archivo
Implemente el archivo bpmn y el archivo de imagen png respectivamente.
public class ActivitiDemo {
/**
* 部署流程定义
*/
@Test
public void testDeployment(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、使用RepositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
.addClasspathResource("bpmn/evection.png") // 添加png资源
.name("出差申请流程")
.deploy();
// 4、输出部署信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
}
Después de realizar esta operación, activiti guardará el archivo bpm y el archivo de imagen especificados en el código anterior en la base de datos de activiti.
Método de implementación de paquetes comprimidos
Comprimir evection.bpmn
y evection.png
comprimir en un paquete zip.
@Test
public void deployProcessByZip() {
// 定义zip输入流
InputStream inputStream = this
.getClass()
.getClassLoader()
.getResourceAsStream(
"bpmn/evection.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
// 流程部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
Después de realizar esta operación, activiti guardará el archivo bpm y el archivo de imagen especificados en el código anterior en la base de datos de activiti.
Hoja de datos operativos
Las tres tablas para las actividades operativas después de implementar la definición del proceso son las siguientes:
act_re_deployment
Tabla de implementación de definición de proceso, cada implementación agrega un registroact_re_procdef
Tabla de definición de procesos, la implementación de cada nueva definición de proceso agregará un registro a esta tablaact_ge_bytearray
Tabla de recursos de proceso
A continuación, echemos un vistazo a qué datos se escriben:
SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息
resultado:
SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息
resultado:
Tenga en cuenta que el campo CLAVE es una palabra clave utilizada para identificar de forma única diferentes procesos
SELECT * FROM act_ge_bytearray #资源表
resultado:
Aviso:
act_re_deployment
Y act_re_procdef
una relación de uno a muchos, una implementación genera un registro en la tabla de implementación de procesos, pero una implementación puede implementar múltiples definiciones de procesos, y cada definición de proceso genera un registro en la tabla de definición de procesos. Cada definición de proceso act_ge_bytearray
tendrá dos registros de recursos, bpmn y png.
Sugerencia: implemente un proceso a la vez, de modo que la tabla de implementación y la tabla de definición de procesos tengan una relación de uno a uno, lo cual es conveniente para leer la información de implementación y definición de procesos.
6.3 Iniciar instancia de proceso
Después de implementar la definición del proceso en activiti, el proceso comercial se puede administrar a través del flujo de trabajo, es decir, se puede usar el proceso de solicitud de viajes de negocios implementado anteriormente.
Para este proceso, iniciar un proceso significa lanzar un nuevo formulario de solicitud de viaje de negocios, que es equivalente a la relación entre una clase java y un objeto java. Después de definir la clase, debe crear un objeto con new. Por supuesto, debe puede nuevos objetos múltiples. Para el proceso de solicitud de viaje de negocios, Zhang San debe iniciar una instancia de proceso cuando inicia un formulario de solicitud de viaje de negocios, y debe iniciarse una instancia de proceso cuando el formulario de solicitud de viaje de negocios inicia una orden de viaje de negocios.
el código se muestra a continuación:
/**
* 启动流程实例
*/
@Test
public void testStartProcess(){
// 1、创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、根据流程定义Id启动流程
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myEvection");
// 输出内容
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("当前活动Id:" + processInstance.getActivityId());
}
La salida es la siguiente:
Hoja de datos operativos
act_hi_actinst
Historial de ejecución de la instancia de procesoact_hi_identitylink
Procesar la información del historial de participación del usuarioact_hi_procinst
Información del historial de instancias de procesoact_hi_taskinst
Procesar la información del historial de tareasact_ru_execution
Información de ejecución del procesoact_ru_identitylink
Información del usuario participante del procesoact_ru_task
información de la tarea
6.4 Consulta de tareas
Una vez que se inicia el proceso, la persona a cargo de la tarea puede consultar las tareas que necesita procesar actualmente, y las tareas que se consultan son todas las tareas pendientes del usuario.
/**
* 查询当前个人待执行的任务
*/
@Test
public void testFindPersonalTaskList() {
// 任务负责人
String assignee = "zhangsan";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("myEvection") //流程Key
.taskAssignee(assignee)//只查询该任务负责人的任务
.list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
La salida es la siguiente:
流程实例id:2501
任务id:2505
任务负责人:zhangsan
任务名称:创建出差申请
6.5 Procesamiento de tareas de proceso
El líder de la tarea consulta las tareas pendientes, selecciona las tareas para procesar y completa las tareas.
// 完成任务
@Test
public void completTask(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取taskService
TaskService taskService = processEngine.getTaskService();
// 根据流程key 和 任务的负责人 查询任务
// 返回一个任务对象
Task task = taskService.createTaskQuery()
.processDefinitionKey("myEvection") //流程Key
.taskAssignee("zhangsan") //要查询的负责人
.singleResult();
// 完成任务,参数:任务id
taskService.complete(task.getId());
}
6.6 Consulta de información de definición de proceso
Consultar información relacionada con el proceso, incluida la definición del proceso, la implementación del proceso y la versión de la definición del proceso
/**
* 查询流程定义
*/
@Test
public void queryProcessDefinition(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 得到ProcessDefinitionQuery 对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 查询出当前所有的流程定义
// 条件:processDefinitionKey =evection
// orderByProcessDefinitionVersion 按照版本排序
// desc倒叙
// list 返回集合
List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
.orderByProcessDefinitionVersion()
.desc()
.list();
// 输出流程定义信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义 id="+processDefinition.getId());
System.out.println("流程定义 name="+processDefinition.getName());
System.out.println("流程定义 key="+processDefinition.getKey());
System.out.println("流程定义 Version="+processDefinition.getVersion());
System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
}
}
Resultado de salida:
流程定义id:myEvection:1:4
流程定义名称:出差申请单
流程定义key:myEvection
流程定义版本:1
6.7 Eliminación de procesos
public void deleteDeployment() {
// 流程部署id
String deploymentId = "1";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine
.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryService.deleteDeployment(deploymentId, true);
}
ilustrar:
- Use repositoryService para eliminar la definición del proceso y la información de la tabla de historial no se eliminará
- Si no hay ningún proceso en ejecución en la definición del proceso, se puede eliminar con normalidad.
Si ya hay un proceso en ejecución en la definición del proceso, use la eliminación común para informar un error y use el método de eliminación en cascada para eliminar todo el proceso y los registros relacionados.
Elimine primero los nodos de proceso sin terminar y, finalmente, elimine por completo la información de definición del proceso.
Las operaciones de eliminación en cascada en el desarrollo de proyectos generalmente solo están disponibles para los superadministradores.
6.8 Descarga de recursos del proceso
Ahora nuestros archivos de recursos de proceso se han cargado en la base de datos. Si otros usuarios desean ver estos archivos de recursos, pueden descargar los archivos de recursos de la base de datos al local.
Las soluciones son:
- Jdbc lee datos de tipo blob y clob y los guarda en el directorio de archivos
- Use la API de activiti para lograr
Use commons-io.jar para resolver operaciones de IO
Introducir el paquete de dependencia commons-io
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
Obtenga recursos de definición de procesos a través de objetos de definición de procesos, obtenga bpmn y png
import org.apache.commons.io.IOUtils;
@Test
public void deleteDeployment(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 根据部署id 删除部署信息,如果想要级联删除,可以添加第二个参数,true
repositoryService.deleteDeployment("1");
}
public void queryBpmnFile() throws IOException {
// 1、得到引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.singleResult();
// 4、通过流程定义信息,得到部署ID
String deploymentId = processDefinition.getDeploymentId();
// 5、通过repositoryService的方法,实现读取图片信息和bpmn信息
// png图片的流
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
// bpmn文件的流
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
// 6、构造OutputStream流
File file_png = new File("d:/evectionflow01.png");
File file_bpmn = new File("d:/evectionflow01.bpmn");
FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
FileOutputStream pngOut = new FileOutputStream(file_png);
// 7、输入流,输出流的转换
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
// 8、关闭流
pngOut.close();
bpmnOut.close();
pngInput.close();
bpmnInput.close();
}
ilustrar:
deploymentId
Implementar el ID para el procesoresource_name
esact_ge_bytearray
el valor de la columna NAME_ en la tablarepositoryService
El método utilizadogetDeploymentResourceNames
puede obtener los nombres de todos los archivos en la implementación especificada- El método utilizado
repositoryService
paragetResourceAsStream
pasar el ID de implementación y el nombre de la imagen del recurso puede obtener el flujo de entrada del archivo con el nombre especificado en la implementación.
El último genera los recursos de imagen en el flujo de entrada.
6.9 Ver información del historial del proceso
act_hi_*
Incluso si se ha eliminado la definición del proceso, la información histórica de la ejecución del proceso aún se almacena en las tablas relevantes de actividades a través del análisis anterior . Por lo tanto, aún podemos consultar la información histórica de la ejecución del proceso y podemos HistoryService
ver los registros históricos relevantes a través de .
/**
* 查看历史信息
*/
@Test
public void findHistoryInfo(){
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
// 查询 actinst表,条件:根据 InstanceId 查询
// instanceQuery.processInstanceId("2501");
// 查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId("myEvection:1:4");
// 增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
// 查询所有内容
List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
// 输出
for (HistoricActivityInstance hi : activityInstanceList) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
System.out.println("<==========================>");
}
}
Resumir
Se introducen y completan las funciones básicas.Si necesita funciones más avanzadas como suspender, activar instancias de proceso, variables de proceso, etc., consulte
La combinación del motor de flujo de trabajo Activiti y Spring Boot facilitará el desarrollo, echemos un vistazo
Fuente: https://blog.csdn.net/agonie201218/article/details/118198535
Recomendación de artículo reciente:
1. Más de 1000 preguntas y respuestas de entrevistas en Java (última versión de 2022)
2. ¡Brillante! Las corrutinas de Java están llegando. . .
3. Tutorial de Spring Boot 2.x, ¡demasiado completo!
5. La última versión del "Manual de desarrollo de Java (edición Songshan)", ¡descárguelo rápidamente!
¡Siéntete bien, no olvides darle me gusta + adelante!