Flowable简洁通关
Flowable 快速上手指南
目录
Flowable 概述
Flowable 是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在 Java 应用程序中实现复杂的工作流自动化。Flowable 最初是作为 Activiti 项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用。
Flowable 的安装与配置
在安装配置之前,我们首先要明确学习 Flowable 最基本的工具。
2.1 FlowableUI 安装
FlowableUI 是 Flowable 引擎的一部分,专注于提供用户界面(UI)功能,用于业务流程管理(BPM)和工作流自动化。Flowable 是一个开源的 BPMN(业务流程建模与标记法)引擎,支持复杂的工作流和业务规则。流程图基本上是由 FlowableUI 绘制的,完成后由代码进行操作使用。
安装步骤
-
下载 Flowable 6.7.2 源码包
官方提供的 FlowableUI 集成在 Flowable 源码包中。在最新版本 7.0.0 中已经移除,因此需要从 6.7.2 版本中获取。进入 GitHub Release 页面 下载代码。 -
提取
flowable-ui.war文件
在下载的源码包中,找到对应的flowable-ui.war文件。 -
部署到 Tomcat 容器
将flowable-ui.war文件部署到 Tomcat 容器中,注意不要部署在有中文的目录下。启动 Tomcat 服务后,访问 FlowableUI 地址:http://localhost:8080/flowable-ui。
2.2 Flowable BPMN 插件下载
进入 IDEA 的插件下载界面,搜索并下载 Flowable BPMN 插件。该插件用于编辑和可视化 Flowable BPMN 图,并提供导航和流程调试支持。
2.3 集成 Spring Boot
Spring Boot 提倡约定大于配置。要开始工作,只需在项目中添加以下依赖:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
因为 Flowable 需要数据库来存储数据,直接引用上述依赖可能会导致异常。建议在建立简单的 Spring Boot 项目后,添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</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>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
接下来在 application.yml 中配置如下信息:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flowable-learn?serverTimezone=UTC&nullCatalogMeansCurrent=true
username: root
password: 123456
hikari:
minimum-idle: 5
idle-timeout: 600000
maximum-pool-size: 10
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
flowable:
async-executor-activate: true # 关闭定时任务 JOB
database-schema-update: true # 自动更新数据库表结构
server:
port: 8082
logging:
level:
org:
flowable: debug
启动项目后,若无报错信息即为成功。
流程审核操作
在下载并安装好 FlowableUI 后,可以尝试绘制流程图,例如审批人依次为 zhangsan 和 lisi 的流程。
3.1 简单流程部署
此操作会根据路径解析传入的流程图 XML 文件。
@Autowired
private ProcessEngine processEngine;
@Test
void deployFlow() {
Deployment deploy = processEngine.getRepositoryService().createDeployment()
.addClasspathResource("process/HolidayDemo1.bpmn20.xml") // 部署一个流程
.name("第一个流程案例")
.deploy();
System.out.println(deploy.getId());
}
部署成功后,相关信息会记录在以下三张表中:
act_ge_bytearray:记录流程定义的资源信息(XML 和流程图的图片信息)。act_re_deployment:流程部署表,记录这次的部署行为。act_re_procdef:流程定义表,记录这次部署动作对应的流程定义信息。
3.2 启动流程实例
@Test
void startProcess() {
RuntimeService runtimeService = processEngine.getRuntimeService();
// 方法一:根据 act_re_procdef 表中的 id 启动
String processId = "Exanple01:2:a7de575b-a73b-11ef-a2cb-005056c00001";
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId);
System.out.println("processInstance.getId() = " + processInstance.getId());
// 方法二:根据流程图中定义的 Key 启动
// String processKey = "HolidayDemo1";
// runtimeService.startProcessInstanceByKey(processKey);
}
启动流程实例后,可以在 act_ru_task 表中看到对应的记录。每启动一个流程实例,会在 act_hi_procinst 表中维护一条记录,并在 act_ru_execution 表中记录流程的分支。
3.3 流程审批
查询待办任务
@Test
void findTask() {
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.taskAssignee("zhangsan") // 根据审批人查询
.list(); // 返回多条记录
for (Task task : list) {
System.out.println(task.getId());
}
}
完成任务审批
@Test
void completeTask() {
TaskService taskService = processEngine.getTaskService();
String taskId = "926b41f8-7a4c-11ee-97fd-c03c59ad224

浙公网安备 33010602011771号