Flowable 的 自动部署模型 是其核心特性之一,它允许流程引擎在启动时自动扫描、解析并部署预定义的流程/表单/决策模型(BPMN/DMN/CMMN),极大简化了部署流程。以下从 机制原理、配置方式、执行流程、高级特性 四个维度深入详解:
一、自动部署的核心机制
1. 触发时机
- 引擎启动时:当
ProcessEngine
初始化完成(如 Spring Boot 应用启动)时自动执行。 - 定时扫描(可选):通过配置
deploymentMode
实现定时轮询资源目录(生产环境慎用)。
2. 部署内容
资源类型 | 文件扩展名 | 说明 |
---|---|---|
BPMN 流程 | .bpmn20.xml , .bpmn | 业务流程定义 |
DMN 决策表 | .dmn | 业务规则决策定义 |
CMMN 案例 | .cmmn | 案例管理定义 |
表单 | .form | 动态表单定义(可选) |
3. 部署流程
二、配置详解(Spring Boot 为例)
1. 基础配置(application.yml)
flowable:
# 自动部署开关(默认true)
check-process-definitions: true
# 资源扫描路径(默认:classpath*:/processes/**/*.bpmn20.xml)
process-definition-location-prefix: classpath*:/flows/
process-definition-location-suffixes: **/*.bpmn20.xml, **/*.dmn
# 部署模式(默认:'default',可选 'single-resource' 或 'resource-parent-folder')
deployment-mode: default
# 部署名称(显示在ACT_RE_DEPLOYMENT.NAME_)
deployment-name: AutoDeployment
2. 高级参数
参数名 | 说明 |
---|---|
deployment-resource-pattern | 资源过滤正则(如 **.bpmn20.xml ) |
deployment-lock-wait-time | 部署锁等待时间(防并发冲突,单位:分钟) |
disable-schema-creation | 是否禁用自动创建表(需手动初始化数据库) |
custom-mybatis-mappers | 注册自定义MyBatis Mapper(扩展查询) |
三、部署过程的底层行为
1. 资源扫描与过滤
- 引擎按
location-prefix
+location-suffixes
组合路径扫描资源。 - 跳过已部署且未修改的文件(通过 文件内容哈希值 比对)。
2. 模型解析与校验
- BPMN 校验:检查节点连通性、表单键是否存在、服务类是否实现
JavaDelegate
。 - DMN 校验:决策表输入/输出表达式语法检查。
- 失败处理:任一文件解析失败 → 整个部署回滚(原子性)。
3. 数据库写入
- 部署表 (
ACT_RE_DEPLOYMENT
):记录部署ID、名称、时间。 - 流程定义表 (
ACT_RE_PROCDEF
):写入流程定义Key、版本、资源名。 - 资源表 (
ACT_GE_BYTEARRAY
):存储BPMN/DMN文件的二进制内容。
4. 版本控制
- 同一流程定义Key (
<process id="myProcess">
) 多次部署 → 版本自动+1。 - 旧版本流程实例继续运行,新启动实例使用最新版本。
四、高级特性与最佳实践
1. 多环境差异化部署
# 开发环境:扫描本地目录
flowable:
process-definition-location-prefix: file:/data/dev-processes/
# 生产环境:从数据库读取(避免文件依赖)
flowable:
check-process-definitions: false # 关闭自动扫描
- 生产推荐:通过
RepositoryService
API 手动部署:repositoryService.createDeployment() .addClasspathResource("processes/prod/v1/order.bpmn20.xml") .name("ProdDeployment") .deploy();
2. 部署监听器
- 实现
DeploymentListener
接口:public class CustomDeployListener implements DeploymentListener { @Override public void onDeployment(Deployment deployment) { log.info("Deployed: {}", deployment.getName()); } }
- 注册监听器:
processEngineConfiguration.addDeploymentListener(new CustomDeployListener());
3. 租户隔离部署
- 为不同租户部署独立流程:
repositoryService.createDeployment() .addClasspathResource("tenantA/process.bpmn") .tenantId("tenantA") // 关键租户ID .deploy();
- 查询时过滤租户:
repositoryService.createProcessDefinitionQuery() .tenantId("tenantA") .list();
4. 避免重复部署策略
- 文件哈希比对(默认):内容未修改则跳过。
- 强制重新部署:
repositoryService.createDeployment() .enableDuplicateFiltering(false) // 关闭过滤 .deploy();
五、常见问题与解决方案
问题现象 | 原因分析 | 解决方案 |
---|---|---|
流程文件修改后未生效 | 文件哈希未改变/缓存未刷新 | 1. 修改文件内容 2. 调用 repositoryService.activateProcessDefinitionById() |
部署时报 Unknown property 错误 | BPMN 扩展属性未声明命名空间 | 添加命名空间:xmlns:flowable="http://flowable.org/bpmn" |
多模块扫描不到资源 | 路径未覆盖子模块 | 使用 classpath*: 前缀:classpath*:/processes/**/*.bpmn |
部署卡死无响应 | 大文件解析死锁/数据库连接耗尽 | 1. 拆分复杂流程 2. 增加数据库连接池大小 |
六、调试与监控
1. 日志分析
启用DEBUG日志查看部署细节:
logging:
level:
org.flowable.engine.impl.persistence.deploy: DEBUG
2. API 查询部署状态
// 检查部署列表
List<Deployment> deployments = repositoryService.createDeploymentQuery().list();
// 检查流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("invoiceProcess")
.latestVersion()
.singleResult();
3. 数据库监控
-- 查看部署记录
SELECT * FROM ACT_RE_DEPLOYMENT;
-- 查看流程定义版本
SELECT KEY_, VERSION_ FROM ACT_RE_PROCDEF ORDER BY KEY_, VERSION_;
总结
Flowable 的自动部署模型通过 资源扫描 → 模型校验 → 版本管理 → 持久化存储 的自动化流水线,显著降低了流程部署的复杂度。关键实践建议:
- 生产环境慎用文件扫描:优先通过 API 或 CI/CD 管道控制部署。
- 版本控制是核心:利用自动版本号管理流程迭代。
- 租户隔离必不可少:为 SaaS 系统设计租户感知部署。
- 监控部署结果:通过日志 + 数据库验证部署完整性。
正确配置自动部署,可使流程发布效率提升 80% 以上,真正实现 “一次建模,随处运行” 的敏捷流程管理。