Flowable引擎CMMN API深度解析
概述
Flowable CMMN引擎提供了一套完整的API体系,用于管理和执行基于CMMN 1.1规范的案例管理模型。本文将深入解析Flowable CMMN引擎的核心API服务及其使用方法,帮助开发者更好地理解和运用这一强大的工作流引擎。
核心服务接口
Flowable CMMN引擎通过一系列服务接口提供完整的功能支持,这些服务都是线程安全的,可以在整个服务器生命周期中保持引用。
1. 服务获取方式
通过CmmnEngineConfiguration创建独立配置的CMMN引擎实例后,可以获取各服务接口:
CmmnEngine cmmnEngine = CmmnEngineConfiguration.createStandaloneCmmnEngineConfiguration();
// 获取各服务接口
CmmnRuntimeService runtimeService = cmmnEngine.getCmmnRuntimeService();
CmmnRepositoryService repositoryService = cmmnEngine.getCmmnRepositoryService();
CmmnTaskService taskService = cmmnEngine.getCmmnTaskService();
CmmnManagementService managementService = cmmnEngine.getCmmnManagementService();
CmmnHistoryService historyService = cmmnEngine.getCmmnHistoryService();
2. 各服务功能详解
CmmnRepositoryService
- 功能:管理与操作案例定义和部署
- 核心能力:
- 部署包含CMMN 1.1 XML文件和其他资源的部署包
- 查询引擎已知的部署和案例定义
- 检索部署中包含的各种资源
- 获取案例定义的POJO版本,便于通过Java而非XML进行内省
CmmnRuntimeService
- 功能:处理案例实例的执行
- 核心能力:
- 启动新的案例实例
- 检索和存储案例变量
- 查询案例实例和计划项(Plan Item)
- 通过"信号"机制继续等待外部触发的案例实例
CmmnTaskService
- 功能:管理人工任务
- 核心能力:
- 查询分配给用户或组的任务
- 创建独立任务(不与案例实例关联)
- 管理任务分配和参与用户
- 认领和完成任务
CmmnHistoryService
- 功能:提供历史数据访问
- 核心能力:
- 查询案例实例启动时间
- 查询任务执行者和完成时间
- 查询案例实例执行路径等历史信息
CmmnManagementService
- 功能:提供底层管理功能
- 核心能力:
- 访问数据库表信息
- 查询和执行各种作业
异常处理机制
Flowable采用统一的异常处理策略,基础异常为org.flowable.engine.common.api.FlowableException,这是一个非检查型异常。特定场景下会抛出更具体的子类异常:
- FlowableWrongDbException:数据库模式版本与引擎版本不匹配
- FlowableOptimisticLockingException:数据并发访问导致的乐观锁异常
- FlowableClassLoadingException:类加载失败
- FlowableObjectNotFoundException:请求对象不存在
- FlowableIllegalArgumentException:非法参数
- FlowableTaskAlreadyClaimedException:任务已被认领
查询API
Flowable提供两种数据查询方式:
1. 类型安全查询API
使用流畅的API构建完全类型安全的查询,支持条件组合和精确排序:
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("kermit")
.orderByDueDate().asc()
.list();
2. 原生查询
支持直接使用SQL进行更灵活的查询。
变量系统
变量是案例执行过程中存储和使用数据的核心机制。
1. 变量类型
- 案例变量:绑定到整个案例实例
- 计划项实例变量:绑定到特定计划项实例
- 任务变量:绑定到人工任务
2. 变量操作
创建案例实例时设置变量:
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder()
.variable("var1", "test")
.start();
运行时操作变量:
// 设置多个变量
runtimeService.setVariables(caseInstanceId, variablesMap);
// 获取所有变量
Map<String, Object> variables = runtimeService.getVariables(caseInstanceId);
// 获取单个变量
Object value = runtimeService.getVariable(caseInstanceId, "varName");
3. 临时变量(Transient Variables)
临时变量与常规变量类似,但不会被持久化:
- 无历史记录
- 存储在最高父级上
- 只能在下个等待状态前访问
- 会遮蔽同名的持久变量
设置临时变量:
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder()
.transientVariable("tempVar", "value")
.start();
表达式系统
Flowable使用UEL(Unified Expression Language)进行表达式解析。
1. 表达式类型
-
值表达式:解析为值
${myVariable} ${myBean.myProperty} -
方法表达式:调用方法
${printer.print()} ${myBean.addNewOrder('orderName')}
2. 默认可用对象
caseInstance:当前案例实例信息planItemInstance:当前计划项实例信息planItemInstances:所有计划项实例信息variableContainer:变量容器抽象authenticatedUserId:当前认证用户ID
3. planItemInstances高级用法
planItemInstances提供强大的链式过滤查询能力:
// 统计活跃的计划项实例
${planItemInstances.active().count()}
// 按ID过滤
${planItemInstances.active().definitionIds('a', 'b').count()}
// 获取当前阶段终止状态的计划项ID
${planItemInstances.currentStage().onlyTerminal().getDefinitionIds()}
支持的状态过滤方法:
active(),available(),enabled(),disabled()completed(),terminated(),unavailable()waitingForRepetition(),asyncActive()
最佳实践建议
-
服务引用:由于服务对象是线程安全的,建议在应用启动时获取并长期持有服务引用。
-
变量使用:
- 合理规划变量作用域
- 敏感数据考虑使用临时变量
- 避免存储过大对象
-
异常处理:
- 对预期可能发生的异常做好捕获处理
- 使用细粒度异常类型进行精确处理
-
查询优化:
- 对大数据量查询使用分页
- 合理使用索引字段进行查询
-
表达式使用:
- 保持表达式简洁
- 避免复杂业务逻辑放入表达式
- 考虑性能影响
通过深入理解Flowable CMMN引擎的API体系,开发者可以构建出高效、可靠的案例管理系统,充分发挥CMMN规范在复杂业务场景下的优势。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



