由于工作需要,需要实现自定义审核流程,就查找资料实现,这是我实现的步骤。

Activiti官方网站:http://activiti.org/download.html

一、idea安装activiti

地址: https://plugins.jetbrains.com/

搜索: actiBPM

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring boot

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring_02

IDEA哪里查看dubbo的端口号 idea查看bpmn_IDEA哪里查看dubbo的端口号_03

IDEA哪里查看dubbo的端口号 idea查看bpmn_java_04

二、使用activiti

将bpmn文件放到resources下的processes下,springboot启动时会自动部署

2.1 在resource下面创建BpmnFile文件

IDEA哪里查看dubbo的端口号 idea查看bpmn_intellij-idea_05


id要唯一

IDEA哪里查看dubbo的端口号 idea查看bpmn_java_06

2.2 添加图标

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring boot_07

鼠标左键拖拽StartEvent到界面上,同样再弄几个其他图标

IDEA哪里查看dubbo的端口号 idea查看bpmn_IDEA哪里查看dubbo的端口号_08

2.3 生成图片

右键进行改名,把后缀改为.xml结尾

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring boot_09


然后在改成的xml文件上面右键点击show BPMN 2.0Designer…

IDEA哪里查看dubbo的端口号 idea查看bpmn_intellij-idea_10


出现这个界面点击箭头指的图标,选择项目的resourcr文件夹(或者再在下面创建一个文件),把生成的.png图片存储进去

IDEA哪里查看dubbo的端口号 idea查看bpmn_intellij-idea_11


IDEA哪里查看dubbo的端口号 idea查看bpmn_spring_12

2.4 图片的中文乱码问题

可能生成的图片会有中文乱码问题,如下解决:
不过如果有中文会出现乱码,需要在这两个文件下的后面都加上-Dfile.encoding=UTF-8

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring boot_13


IDEA哪里查看dubbo的端口号 idea查看bpmn_spring boot_14

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring_15

然后重启IDEA,把原来的PNG图片删掉,再生成一次就不会出现乱码了

IDEA哪里查看dubbo的端口号 idea查看bpmn_java_16

将bpmn文件放到resources下的processes下,springboot启动时会自动部署

三、springboot项目整合activiti

3.1 依赖

<!-- mybatis-->
   <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
  </dependency>
        
  <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>


 <!-- Activiti  各个依赖的版本要一致要不然启动不了的-->
        <!--  Activiti 启动器-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>5.23.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Activiti 流程图-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-diagram-rest</artifactId>
            <version>5.23.0</version>
        </dependency>
        <!-- Activiti 在线设计-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-modeler</artifactId>
            <version>5.23.0</version>
        </dependency>

<!--    <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>5.23.0</version>
        </dependency>-->

3.2 解决中文乱码需要添加一个配置类

import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;

/**
 * activiti的配置类
 * 解决activiti的中文乱码问题
 * 
 * @author lc
 * @version 1.0
 * @date 2022/4/27 9:32
 */
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {

    @Override
    public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {
        springProcessEngineConfiguration.setLabelFontName("宋体");
        springProcessEngineConfiguration.setActivityFontName("宋体");
    }

}

3.3 application.yml配置

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/spbt-activiti7?nullCatalogMeansCurrent=true
    driver-class-name: com.mysql.cj.jdbc.Driver
  devtools:
      restart:
        enabled: true  #设置开启热部署
  activiti:
    database-schema-update: true
    history-level: full
    db-history-used: true
    check-process-definitions: false  # 是否开启自动部署,false表示不开起
    # process-definition-location-prefix: classpath:/processes/   # 自动部署的时候打开这个
    async-executor-activate: false     # 启用异步执行器
    job-executor-activate: false      # 启用作业执行器

配置解释

- database-schema-update配置项可以设置流程引擎启动和关闭时数据库执行的策略,database-schema-update有以下四个值:

false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。


- history-level对于历史数据,保存到何种粒度,Activiti提供了history-level属性对其进行配置。history-level属性有点像log4j的日志输出级别,该属性有以下四个值:

none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。

-db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示。

3.4 启动,会自动生成25张表到数据库中

IDEA哪里查看dubbo的端口号 idea查看bpmn_IDEA哪里查看dubbo的端口号_17


各个表的含义:

IDEA哪里查看dubbo的端口号 idea查看bpmn_spring_18

ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
 ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下。

3.5 启动报错解决

3.5.1 问题一:java.io.FileNotFoundException:

class path resource [org/springframework/security/config/annotation/authentication/configurers/GlobalAuthenticationConfigurerAdapter.class] cannot be opened because it does not exist

IDEA哪里查看dubbo的端口号 idea查看bpmn_IDEA哪里查看dubbo的端口号_19


解决办法:

启动项上方@SpringBootApplication注解里面加exclude = SecurityAutoConfiguration.class

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)

注意:SecurityAutoConfiguration.class导入的包是 activiti的

正确的

import org.activiti.spring.boot.SecurityAutoConfiguration;
错误的:
 import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

3.5.2 问题二、java.lang.ClassNotFoundException:

org.activiti.bpmn.model.AdhocSubProcess

这是由于activiti在pom中的依赖版本不一致,要填写一致版本的依赖

3.5.2 问题三、Table ‘newsell.act_ge_property’ doesn’t exist

在mysql的连接字符串上加上nullCatalogMeansCurrent=true

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/newsell?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=true&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver

3.6 按照使用activiti的方法操作一遍得到正常的就说明对了

IDEA哪里查看dubbo的端口号 idea查看bpmn_java_20

流程文件部署,部署方式分为两种:自动部署和手动部署【有时候自动部署不会成功】
自动部署:将bpmn文件放到resources下的processes下,springboot启动时会自动部署,部署对应的表为:act_re_deployment;
手动方式部署:在maven项目的测试文件夹下,新建测试类(TestActiviti),并编写测试方法,进行流程文件部署,部署代码如下;

import org.activiti.engine.RepositoryService;

// 手动方式部署
@Autowired
 private RepositoryService repositoryService;

 @GetMapping("/test")
    public void test(String[] args) {
        Deployment deployment = repositoryService.createDeployment().name("测试流程文件部署")
                .addClasspathResource("processes/test001.bpmn")
                .addClasspathResource("processes/test001.png").deploy();

        System.out.println("部署id为:"+deployment.getId());
        System.out.println("部署名称为:"+deployment.getName());
    }

IDEA哪里查看dubbo的端口号 idea查看bpmn_IDEA哪里查看dubbo的端口号_21

四、使用activiti