目录
- Flowable 概述
- Flowable的安装与配置
2.1. FlowableUI安装
2.2. Flowable BPMN插件下载
2.3 集成Spring Boot - 流程审核操作
3.3 简单流程部署
3.4 启动流程实例
3.5 流程审批
一、Flowable 概述
Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用二、Flowable的安装与配置
在安装配置之前我们首先要明确学习 Flowable最基本的工具。1、FlowableUI: FlowableUI 是 Flowable 引擎的一部分,专注于提供用户界面(UI)功能,用于业务流程管理(BPM)和工作流自动化。Flowable 是一个开源的 BPMN(业务流程建模与标记法)引擎,支持复杂的工作流和业务规则。 也就是说我们的流程图基本上就是由FlowableUI做出来。流程图做好后才由代码进行操作使用。
2、Flowable BPMN:IDEA中的插件用于编辑和可视化 Flowable BPMN 图,并提供导航和流程调试支持。提供在代码和 BPMN 图之间跳转的必要粘合剂,并将 IntelliJ 重构(例如更改 bean 名称)桥接到 XML 图。
1、FlowableUI安装
下面演示 FlowableUI下载配置官方提供的FlowableUI是集成在Flowable源码包中的。但是在最新的7.0.0中已经移除了。我们需要在6.7.2中获取。进入GitHub将代码下载下来
https://github.com/flowable/flowable-engine/releases/tag/flowable-6.7.2
对应的流程设计器(FlowableUI)在如下目录中:
然后我们把这个<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">flowable-ui.war</font>
扔到自己的Tomcat容器中<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">不要部署在有中文的目录下!!!,</font><font style="color:rgb(51, 51, 51);">Tomcat自己下载在此不做介绍</font>
进入命令行窗口输入 startup.bat 然后启动Tomcat服务即可:看到如下界面即为启动成功!
启动后访问FlowableUI地址:http://localhost:8080/flowable-ui
登录成功的效果
2、Flowable BPMN插件下载
进入IDEA的插件下载界面进行下载即可3、集成Spring Boot
Spring Boot提倡约定大于配置。要开始工作,只需在项目中添加_ flowable-spring-boot-starter_ 或_ flowable-spring-boot-starter-rest_ 依赖。<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>${flowable.version}</version>
</dependency>
因为Flowable需要数据库来存储数据。自引用上面的依赖会得到异常提示,也是为了方便操作大家在建立起简单的Spring Boot项目(即只引用Spring Web)后可以直接将以下依赖粘贴到Maven中
<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>
<!--Flowable的核心依赖-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
<!-- MySQL的依赖 -->
<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
#注意在url中需要添加`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
# 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。前提是数据库中只能有flowable-learn架构,架构中不能有表。
database-schema-update: true
server:
port: 8082
logging:
level:
org:
flowable: debug
之后启动项目。若无报错信息即为启动成功。
三、流程审核操作
在下载好 FlowableUI后可以试着画出流程图如下所示审批人依次是zhangsan和lisi1、简单流程部署
此操作将会根据路径解析传入的流程图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:流程定义表,记录这次部署动作对应的流程定义信息
2、启动流程实例
/**
* 发起流程
*/
@Test
void startProcess(){
// 发起流程需要通过RuntimeService来实现
RuntimeService runtimeService = processEngine.getRuntimeService();
// 方法一:根据 act_re_procdef 表中的id
String processId = "Exanple01:2:a7de575b-a73b-11ef-a2cb-005056c00001";
// 根据流程定义Id启动 返回的是当前启动的流程实例 ProcessInstance
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId);
System.out.println("processInstance.getId() = " + processInstance.getId());
// 方法二:根据流程图中定义的Key启动
// String processKey = "HolidayDemo1";
// runtimeService.startProcessInstanceByKey(processKey);
}
这时我们可以在act_ru_task表中看到对应的记录。act_ru_task记录的都是当前待办的记录信息
还有一个要注意的:每启动一个流程实例那么就会在act_hi_procinst表中维护一条记录。然后在act_ru_execution会记录流程的分支
流程定义和流程实例的关系:
- 流程定义:Java中的类
- 流程实例:Java中的对象
3、流程审批
/**
* 待办任务查询
*/
@Test
void findTask(){
// 任务查询这块我们可以通过 TaskService 来实现
TaskService taskService = processEngine.getTaskService();
// 查询的其实就是 act_ru_task 中的记录
List<Task> list = taskService.createTaskQuery()
.taskAssignee("zhangsan") // 根据审批人来查询
.list();// 返回多条记录
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 完成任务的审批
*/
@Test
void completeTask(){
TaskService taskService = processEngine.getTaskService();
// 需要审批的任务 Id
String taskId = "926b41f8-7a4c-11ee-97fd-c03c59ad2248";
taskService.complete(taskId); // 通过complete方法完成审批
}