一、版本选择
在我们正式建立项目前,我们先去flowable的github主页了解一下版本信息,flowable版本上大的区别主要以7.0.X版本作为界线,通过官方的版本说明我们知道7.0版本主要对JDK17和SpringBoot3做了支持,所以各位读者在选择版本的时候要根据自己项目目前Spring和JDK的版本进行选择,如果是非SpringBoot3.X的版本就使用Flowable7.0.X以下的版本就好。
二、创建项目
1.建立工程
平平无奇地创建一个项目,我的本机JDK版本为17,这里也就不做调整了。
由于SpringBoot2.X版本已经不再维护了,所以在创建时只能选择SpringBoot3.X版本,但是没关系,我们可以创建成功后在pom文件里修改一下。这里演示demo,我还是选择老派的版本咯。
通过查看github,可以看到 flowable 6.X最新的稳定版本是6.8.1,我也就使用这个版本了。所以,这里也想告诉初学者的一个点就是一定要学会去看文档,毕竟教程是具有滞后性的。通过官方的文档说明,我们springboot版本就使用2.7.18吧。
最终,我们的环境是JDK17、Springboot2.7.18、flowable 6.8.1,如果flowable 7.0.X以下的小伙伴使用JDK8也可以,我这只是懒得换环境。
2.导入依赖
这里主要就是Flowable的核心依赖,其他都是通用依赖。
xml
<?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.7.18</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pitayafruit</groupId>
<artifactId>FlowableDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>FlowableDemo</name>
<description>FlowableDemo</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- spring-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- spring-boot-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- flowable -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.8.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.21</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.建立数据库
Flowable需要数据库来存储数据,所以我们需要为它建立一个数据库,表结构则会由引擎为我们自动生成。
4.创建配置文件
配置没什么好说的,大家根据自己的情况进行配置就好。
yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/flowable-demo?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
5.启动项目测试
项目成功启动时,我们可以看到控制台闪过很多提示信息,那是第一次启动项目,Flowable在为我们创建表。
项目启动成功后,可以在数据库中看到79张表,表示我们初步的整合已经成功了。另外,在实际业务中有条件的话,建议将工作流单独部署一个服务和数据库,一下子多了这么多的表在原有的数据库里,对我们管理还是有影响的。
三、表结构
为了更好地理解 Flowable 的实现原理和细节,有必要先理清楚相关表结构及其作用,接下来,我来帮各位读者梳理一下生成的这79张表。
1.表结构分类
Flowable在初始化时会创建五类表结构,具体如下:
- ACT_RE:'RE'表示repository。这个前缀的表包含了流程定义和流程静态资源(图片,规则等等)。
- ACT_RU:'RU'表示runtime。这些运行时的表,包含流程实例,任务,变量,异步任务等运行中的数据。Flowable只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
- ACT_HI:'HI'表示history。这些表包含历史数据,比如历史流程实例,变量,任务等。
- ACT_GE:'GE'表示general。存储Flowable在各种不同场景下需要的通用数据。
- ACT_ID:'ID'表示identity (组织机构)。这些表包含标识的信息,如用户,用户组等。
其中ACT_ID类型的表应该在实际业务中是用不上的,因为实际业务都有自己的一套用户表结构,Flowable 里的这套应该是用不上的。
2.常用表的作用
第一次学习的同学可能乍一看这79张表会感到头疼,光是理清楚每张表和字段的作用就要花很长时间。但实际业务中,就像前文中说的,有些表我们从来就不会用,比如引擎自带的用户相关的表,在我们实际业务中,有我们自己的用户组关系和字段,所以在下面的表格中也不做罗列。
表名 | 解释 |
---|---|
ACT_GE_BYTEARRAY | 存储通用的流程定义和流程资源,即每个流程的部署记录。 |
ACT_GE_PROPERTY | 存储系统相关属性,主要是Flowable 自身的一些变量。 |
ACT_HI_ACTINST | 存储历史的活动信息,记录流程流转过的所有节点。 |
ACT_HI_ATTACHMENT | 存储历史的流程的附件表。 |
ACT_HI_COMMENT | 存储历史的流程说明性信息。 |
ACT_HI_DETAIL | 存储历史的流程运行的细节信息,比如流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。 |
ACT_HI_ENTITYLINK | 存储历史参与的人员。 |
ACT_HI_IDENTITYLINK | 存储任务参与者数据,主要存储历史节点参与者的信息,可能是 Group 也可能是 User。 |
ACT_HI_PROCINST | 存储历史的流程实例,保存每一个历史流程,创建时就生成,一条流程实例对应一个记录。 |
ACT_HI_TASKINST | 存储历史的任务实例,记录每一个历史节点,一个 Task 对应一个记录。 |
ACT_HI_TSK_LOG | 存储历史的任务操作日志,每一次执行可能会带上数据,存在这里。 |
ACT_HI_VARINST | 存储历史的流程运行中的变量信息。 |
ACT_RE_DEPLOYMENT | 存储流程部署记录,每次服务重启会部署一次,这里会新增一条记录。 |
ACT_RE_MODEL | 存储模型信息,创建模型时,额外定义的一些模型相关信息,存在这张表,默认不保存。 |
ACT_RE_PROCDEF | 存储已部署的流程定义,记录流程的变更,流程每变更一次存一条记录,version_字段加1。 |
ACT_RU_EVENT_SUBSCR | 存储运行时事件,当流程定义使用事件(信号/消息/等或启动/中间/边界)时,引擎将对该表的引用存储在该表中。 |
ACT_RU_EXECUTION | 存储运行时流程执行实例和指向流程实例当前状态的指针。 |
ACT_RU_IDENTITYLINK | 存储运行时用户关系信息,即任务节点与参与者的相关信息。 |
ACT_RU_JOB | 存储运行时作业。 |
ACT_RU_TASK | 存储运行时任务。 |
ACT_RU_VARIABLE | 存储运行时变量,是与实例相关的变量。 |
即使仅仅罗列出这些表,初学者可能依然会觉得很难"记",但就像我们初学编程时一样,其实根本不需要特意记一些API,在用的过程中慢慢就熟悉了,在下一篇文章里,将带领大家正式开始编码,通过跑完一个简易的流程,让各位读者可以对相关API和表结构有一个初步的认识。😃