Spring Boot+Activiti7入坑指南初阶版
介绍
Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spring 完美集成,非常轻量级并且基于简单的概念。
官网地址: Open Source Business Automation | Activiti
guithub地址: GitHub - Activiti/Activiti: Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted at business people, developers and system admins. Its core is a super-fast and rock-solid BPMN 2 process engine for Java. It's open-source and distributed under the Apache license. Activiti runs in any Java application, on a server, on a cluster or in the cloud. It integrates perfectly with Spring, it is extremely lightweight and based on simple concepts.Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted at business people, developers and system admins. Its core is a super-fast and rock-solid BPMN 2 process engine for Java. It's open-source and distributed under the Apache license. Activiti runs in any Java application, on a server, on a cluster or in the cloud. It integrates perfectly with Spring, it is extremely lightweight and based on simple concepts. - GitHub - Activiti/Activiti: Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted at business people, developers and system admins. Its core is a super-fast and rock-solid BPMN 2 process engine for Java. It's open-source and distributed under the Apache license. Activiti runs in any Java application, on a server, on a cluster or in the cloud. It integrates perfectly with Spring, it is extremely lightweight and based on simple concepts.
https://github.com/Activiti/Activiti?tab=readme-ov-file

插件安装
在idea插件中安装绘图插件

解决中文乱码
- 在IDEA中将File–>Settings–>Editor–>File Encodings修改为UTF-8
- 在IDEA的Help–>Edit Custom VM Options中末尾添加-Dfile.encoding=UTF-8
- 在IDEA的安装目录的bin目录下将idea.exe.vmoptions和idea64.exe.vmoptions两个文件末尾添加-Dfile.encoding=UTF-8
- 重启idea



Activiti7使用
创建Spring Boot项目
使用IDE中的Spring Boot项目创建向导,创建一个新的Spring Boot项目。
添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.10.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>oa-activiti-workflow</artifactId><version>0.0.1-SNAPSHOT</version><name>oa-activiti-workflow</name><description>oa-activiti-workflow</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>8</java.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><activiti-dependencies.version>7.1.0.M3.1</activiti-dependencies.version></properties><dependencyManagement><dependencies><dependency><groupId>org.activiti.dependencies</groupId><artifactId>activiti-dependencies</artifactId><version>${activiti-dependencies.version}</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><artifactId>junit-jupiter</artifactId><groupId>org.junit.jupiter</groupId></exclusion></exclusions></dependency><!--activiti 7.x依赖 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><!-- 由于activiti7是使用mybatis作为orm框架,我这里整合mybatis-plus,所以需要排除mybatis --><exclusions><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version> <!-- 或最新版本 --><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
配置数据库和Activiti配置
spring.application.name=oa-activiti-workflow
server.port=18080
# 数据库链接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=rootroot# 配置mybatis plus打印sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# activiti配置
## 检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录
spring.activiti.db-history-used=true
# 记录历史等级 可配置的历史级别有none, activity, audit, full
## none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
## activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
## audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
## full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等
spring.activiti.history-level=full
## 1.false:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
## 2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
## 3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
## 4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
spring.activiti.database-schema-update=true
# 校验流程文件,默认校验resources下的processes文件夹里的流程文件
spring.activiti.check-process-definitions=false
启动类
package com.example.oaactivitiworkflow;import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;@SpringBootApplication(exclude = {//activiti 默认整合security,屏蔽Security认证SecurityAutoConfiguration.class,ManagementWebSecurityAutoConfiguration.class,JndiDataSourceAutoConfiguration.class,XADataSourceAutoConfiguration.class
})
public class OaActivitiWorkflowApplication {public static void main(String[] args) {SpringApplication.run(OaActivitiWorkflowApplication.class, args);}}
注意事项
spring.activiti.database-schema-update=true配置完启动测试后,发现发生了报错无法自动创建表。报错内容如下
Caused by: org.activiti.engine.ActivitiException: Could not update Activiti database schema: unknown version from database: '8.1.0'
该错误是由于 Activiti引擎版本与数据库架构版本不匹配 导致的。具体表现为:
- 数据库中记录的Activiti架构版本(schema.version)为8.1.0,但当前项目使用的Activiti依赖版本无法识别该版本号。
- 常见原因包括:
- 项目依赖的Activiti版本低于数据库中的架构版本。
- 数据库版本信息被手动修改或未正确初始化。
- 依赖冲突导致实际加载的Activiti版本与预期不符。
解决办法:
- 手动下载创建表的sql,地址:


- 在数据库中执行创建:

- 修改版本信息,因为我使用的Activiti版本是7.1.0对应的scheme.version为7.0.0.0:
UPDATE ACT_GE_PROPERTY SET VALUE_ = '7.0.0.0' WHERE NAME_ = 'schema.version';
修改后启动build正常。

Activiti表介绍
Activiti 的表都以 ACT_ 开头。
Activiti 使用到的表都是 ACT_ 开头的。表名的第二部分用两个字母表明表的用途。
- ACT_GE_ (GE) 表示 general 全局通用数据及设置,各种情况都使用的数据。
- ACT_HI_ (HI) 表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务,等等
- ACT_ID_ (ID) 表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
- ACT_RE_ (RE) 表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
- ACT_RU_ (RU) 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
数据表介绍
一般数据
表名 | 说明 |
---|---|
ACT_GE_BYTEARRAY | 存储通用的流程定义和流程资源的二进制数据表 |
ACT_GE_PROPERTY | 系统属性表,存储流程引擎级别的数据,初始化时会默认插入三条记录 |
流程历史记录
表名 | 说明 |
---|---|
ACT_HI_ACTINST | 历史节点表 |
ACT_HI_ATTACHMENT | 历史附件表 |
ACT_HI_COMMENT | 历史说明信息表 |
ACT_HI_DETAIL | 记录流程运行中的历史细节信息 |
ACT_HI_IDENTITYLINK | 存储流程运行中的历史用户关系 |
ACT_HI_PROCINST | 历史流程实例表 |
ACT_HI_TASKINST | 历史任务实例表 |
ACT_HI_VARINST | 记录流程运行中的历史变量信息 |
流程定义表
表名 | 说明 |
---|---|
ACT_RE_DEPLOYMENT | 部署单元信息表 |
ACT_RE_MODEL | 模型信息表 |
ACT_RE_PROCDEF | 已部署的流程定义表 |
运行实例表
表名 | 说明 |
---|---|
ACT_RU_EVENT_SUBSCR | 运行时事件表 |
ACT_RU_EXECUTION | 运行时流程执行实例表 |
ACT_RU_IDENTITYLINK | 存储任务节点与参与者关系的运行时用户信息表 |
ACT_RU_JOB | 运行时作业表 |
ACT_RU_TASK | 运行时任务表 |
ACT_RU_VARIABLE | 运行时变量表 |
表说明
act_ge_bytearray
- 二进制数据表,存储通用的流程定义和流程资源
字段名 | 字段描述 | 数据类型 | 主键 | 允许空 | 取值说明 |
---|---|---|---|---|---|
ID_ | 主键ID | nvarchar(64) | Y | N | 表的主键标识 |
REV_ | 乐观锁版本号 | int | N | Y | 用于实现乐观锁控制的版本字段 |
NAME_ | 部署文件名称 | nvarchar(255) | N | Y | 流程定义文件名称,如: leave.bpmn.png |
DEPLOYMENT_ID_ | 部署ID | nvarchar(64) | N | Y | 关联部署表的ID |
BYTES_ | 文件内容 | varbinary(max) | N | Y | 存储部署文件的二进制数据 |
GENERATED_ | 文件生成来源标识 | tinyint | N | Y | 0表示用户生成,1表示系统自动生成 |
act_ge_property
- 属性数据表:属性数据表。存储整个流程引擎级别的数据。
字段名 字段描述 数据类型 主键 允许为空 取值说明 NAME_ 名称 nvarchar(64) √ VALUE_ 值 nvarchar(300) √ 5.create(5.) REV_ 乐观锁 int √ version
act_hi_actinst
- 历史节点表:历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
---|---|---|---|---|---|
ID_ | ID标识 | nvarchar(64) | √ | ||
PROC_DEF_ID_ | 流程定义ID | nvarchar(64) | |||
PROC_INST_ID_ | 流程实例ID | nvarchar(64) | |||
EXECUTION_ID_ | 执行实例ID | nvarchar(64) | |||
ACT_ID_ | 节点ID | nvarchar(225) | 节点定义ID | ||
TASK_ID_ | 任务实例ID | nvarchar(64) | √ | 任务实例ID(其他节点类型实例ID为空) | |
CALL_PROC_INST_ID_ | 外部调用流程实例ID | nvarchar(64) | √ | 外部调用流程的实例ID | |
ACT_NAME_ | 节点名称 | nvarchar(225) | √ | 节点定义名称 | |
ACT_TYPE_ | 节点类型 | nvarchar(225) | 如startEvent、userTask | ||
ASSIGNEE_ | 签收人 | nvarchar(64) | √ | 节点签收人 | |
START_TIME_ | 开始时间 | datetime | |||
END_TIME_ | 结束时间 | datetime | √ | ||
DURATION_ | 耗时 | numeric(19,0) | √ | 毫秒值 | |
DELETE_REASON_ | 删除原因 | nvarchar(4000) | |||
TENANT_ID_ | 租户ID | nvarchar(225) |
act_hi_attachment
- 历史附件表
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID_ | ID_ | nvarchar(64) | √ | 主键ID | |
REV_ | 乐观锁 | integer | √ | Version | |
USER_ID_ | 用户ID | nvarchar(255) | √ | 用户ID | |
NAME_ | 名称 | nvarchar(255) | √ | 附件名称 | |
DESCRIPTION_ | 描述 | nvarchar(4000) | √ | 描述 | |
TYPE_ | 类型 | nvarchar(255) | √ | 附件类型 | |
TASK_ID_ | 任务实例ID | nvarchar(64) | √ | 节点实例ID | |
PROC_INST_ID_ | 流程实例ID | nvarchar(64) | √ | 流程实例ID | |
URL_ | URL_ | nvarchar(4000) | √ | 附件地址 | |
CONTENT_ID_ | 字节表的ID | nvarchar(64) | √ | ACT_GE_BYTEARRAY的ID | |
TIME_ | datetime | √ |
act_hi_comment
- 历史意见表
字段名称 | 字段描述 | 数据类型 | 主键 | 允许为空 | 取值说明 |
---|---|---|---|---|---|
ID_ | ID标识 | nvarchar(64) | √ | 主键ID | |
TYPE_ | 类型 | nvarchar(255) | √ | 类型:event(事件)comment(意见) | |
TIME_ | 时间 | datetime | 记录时间 | ||
USER_ID_ | 用户ID | nvarchar(64) | √ | 操作人ID | |
TASK_ID_ | 节点任务ID | nvarchar(64) | √ | 节点实例ID | |
PROC_INST_ID_ | 流程实例ID | nvarchar(255) | √ | 流程实例ID | |
ACTION_ | 行为类型 | nvarchar(64) | √ | 具体说明见备注1 | |
MESSAGE_ | 基本信息 | nvarchar(4000) | √ | 存储流程生成信息,如审批意见 | |
FULL_MSG_ | 完整内容 | varbinary(max) | √ | 附件存储地址 |
act_hi_detail
- 历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。
字段名称 | 字段描述 | 数据类型 | 主键 | 为空 | 取值说明 |
ID_ | ID_ | nvarchar(64) | √ | 主键 | |
TYPE_ | 类型 | nvarchar(255) | 见备注2 | ||
PROC_INST_ID_ | 流程实例ID | nvarchar(64) | √ | 流程实例ID | |
EXECUTION_ID_ | 执行实例ID | nvarchar(64) | √ | 执行实例ID | |
TASK_ID_ | 任务实例ID | nvarchar(64) | √ | 任务实例ID | |
ACT_INST_ID_ | 节点实例I |