Flowable 教程
一、Flowable 简介
Flowable 是一个基于 BPMN 2.0 规范的轻量级业务流程引擎,支持流程定义、部署、执行与监控。其核心优势包括:
- 灵活扩展:可嵌入 Java 应用或通过 REST API 调用。
- 可视化建模:支持 BPMN 流程设计,结合 Flowable Modeler 实现流程配置可视化。
- 数据持久化:通过数据库表管理流程定义(
ACT_RE_*
)、运行时数据(ACT_RU_*
)、历史数据(ACT_HI_*
)等。
二、环境搭建
1. 创建 Maven 项目
在 pom.xml
中添加依赖:
<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>
<version>8.0.15</version>
</dependency>
2. 配置数据库
在 application.yml
中配置数据源:
spring:
datasource:
url: jdbc:mysql://localhost:3306/flowable?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
flowable:
database-schema-update: true # 自动创建/更新数据库表
3. 初始化流程引擎
方式一:硬编码配置
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
.setJdbcUrl("jdbc:mysql://localhost:3306/flowable")
.setJdbcUsername("root")
.setJdbcPassword("root")
.setJdbcDriver("com.mysql.cj.jdbc.Driver")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine = cfg.buildProcessEngine();
方式二:配置文件 flowable.cfg.xml
在 resources
目录下创建 flowable.cfg.xml
:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/flowable"/>
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
通过 ProcessEngines.getDefaultProcessEngine()
获取引擎实例。
三、核心表结构
分类 | 表名 | 说明 |
---|---|---|
流程定义 | ACT_RE_PROCDEF | 已部署的流程定义 |
运行时数据 | ACT_RU_TASK | 运行时任务 |
历史数据 | ACT_HI_PROCINST | 历史流程实例 |
用户与组 | ACT_ID_USER | 用户表 |
通用数据 | ACT_GE_PROPERTY | 系统属性 |
四、实战示例:请假流程
1. 创建 BPMN 流程定义
在 resources/processes
目录下创建 leave-process.bpmn20.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:flowable="http://flowable.org/bpmn">
<process id="leaveProcess" name="请假流程">
<startEvent id="start" />
<userTask id="submitForm" name="提交请假单" flowable:assignee="${initiator}"/>
<userTask id="leaderApprove" name="领导审批" flowable:candidateGroups="leaders"/>
<exclusiveGateway id="approveDecision" />
<endEvent id="approveEnd" name="审批通过"/>
<endEvent id="rejectEnd" name="审批拒绝"/>
<sequenceFlow sourceRef="start" targetRef="submitForm"/>
<sequenceFlow sourceRef="submitForm" targetRef="leaderApprove"/>
<sequenceFlow sourceRef="leaderApprove" targetRef="approveDecision"/>
<sequenceFlow sourceRef="approveDecision" targetRef="approveEnd">
<conditionExpression>${approved == true}</conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="approveDecision" targetRef="rejectEnd">
<conditionExpression>${approved == false}</conditionExpression>
</sequenceFlow>
</process>
</definitions>
2. 部署流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("processes/leave-process.bpmn20.xml")
.deploy();
3. 启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("initiator", "张三"); // 设置发起人
ProcessInstance instance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
4. 处理任务
TaskService taskService = processEngine.getTaskService();
// 查询待办任务
Task task = taskService.createTaskQuery().taskAssignee("李四").singleResult();
// 完成任务并设置变量
Map<String, Object> params = new HashMap<>();
params.put("approved", true);
taskService.complete(task.getId(), params);
五、高级特性
1. 动态任务分配
通过表达式或监听器动态设置处理人:
<userTask id="handleTask" flowable:assignee="${taskHandler}" />
或通过 TaskListener
实现:
public class TaskAssignmentListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String assignee = calculateAssignee(delegateTask);
delegateTask.setAssignee(assignee);
}
}
2. 多实例任务
配置并行或串行多实例:
<userTask id="multiInstanceTask" flowable:flowable:multiInstanceLoopCharacteristics="sequential" />
3. 事件与错误处理
- 定时事件:通过
flowable:timer
配置。 - 错误边界事件:捕获流程中的异常并跳转到指定节点。
六、日志与监控
1. 日志配置
在 pom.xml
中添加 SLF4J 和 Log4j 依赖,并在 resources
目录下创建 log4j.properties
:
log4j.rootLogger=DEBUG, CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
2. 监控工具
- Flowable Modeler:可视化设计流程。
- Flowable Admin:管理流程定义、实例和任务。