在前五篇文章中,我们从基础概念、流程设计、API 实战、Spring Boot 集成,到外部系统协同,逐步构建了 Flowable 的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求 —— 比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦 Flowable 的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。
一、自定义流程元素:打造专属流程组件
Flowable 的扩展性体现在其对 BPMN 2.0 规范的灵活实现,允许我们通过自定义解析器和行为处理器,创建满足业务需求的专属流程元素。
1.1 自定义任务类型:动态审批任务
以 "多级审批任务" 为例,实现一个支持自动计算审批链的自定义任务:
步骤 1:定义自定义任务的 XML 标签
在 BPMN 文件中使用自定义扩展标签:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:custom="http://flowable.org/custom" <!-- 自定义命名空间 -->
targetNamespace="http://flowable.org/processdef">
<process id="multiLevelApprovalProcess" name="多级审批流程" isExecutable="true">
<startEvent id="startEvent"/>
<!-- 自定义多级审批任务 -->
<userTask id="multiLevelApproval" name="多级审批">
<extensionElements>
<!-- 自定义扩展属性:审批级别规则 -->
<custom:approvalLevel rule="DEPT_MANAGER,FINANCE_MANAGER" condition="${amount > 10000}"/>
<custom:approvalLevel rule="DEPT_MANAGER" condition="${amount <= 10000}"/>
</extensionElements>
</userTask>
<sequenceFlow sourceRef="startEvent" targetRef="multiLevelApproval"/>
<endEvent id="endEvent"/>
<sequenceFlow sourceRef="multiLevelApproval" targetRef="endEvent"/>
</process>
</definitions>
步骤 2:实现自定义解析器
解析自定义标签并转化为流程行为:
// 自定义扩展属性类
@Data
public class ApprovalLevelExtension {
private String rule; // 审批人规则(如"DEPT_MANAGER,FINANCE_MANAGER")
private String condition; // 条件表达式
}
// 自定义解析器
public class CustomUserTaskParser extends UserTaskParser {
@Override
protected void parseExtensionElements(Element element, ScopeImpl scope, BpmnModel bpmnModel) {
super.parseExtensionElements(element, scope, bpmnModel);
// 解析自定义审批级别标签
List<Element> approvalLevelElements = element.elements("approvalLevel");
if (approvalLevelElements != null && !approvalLevelElements.isEmpty()) {
List<ApprovalLevelExtension> extensions = new ArrayList<>();
for (Element approvalElement : approvalLevelElements) {
ApprovalLevelExtension extension = new ApprovalLevelExtension();
extension.setRule(approvalElement.attributeValue("rule"));
extension.setCondition(approvalElement.attributeValue("condition"));
extensions.add(extension);
}
// 存储到流程定义的扩展属性中
scope.setVariable("approvalLevels", extensions);
}
}
}
// 注册自定义解析器
@Configuration
public class CustomParserConfig {
@Bean
public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> customParserConfigurer() {
return configuration -> {
// 获取BPMN解析器
BpmnParser bpmnParser = configuration.getBpmnParser();
// 替换用户任务解析器为自定义实现
Map<String, BpmnParseHandler> parseHandlers = bpmnParser.getBpmnParseHandlers();
parseHandlers.put("userTask", new CustomUserTaskParseHandler());
configuration.setBpmnParser(bpmnParser);
};
}
}
步骤 3:实现自定义任务行为
public class MultiLevelApprovalBehavior extends UserTaskActivityBehavior {
private List<ApprovalLevelExtension> approvalLevels;
public MultiLevelApprovalBehavior(UserTask userTask, List<ApprovalLevelExtension> approvalLevels) {
super(userTask);
this.approvalLevels = approvalLevels;
}
@Override
public void execute(DelegateExecution execution) {
// 1. 计算符合条件的审批级别
List<String> approverRoles = new ArrayList<>();
for (ApprovalLevelExtension level : approvalLevels) {
// 评估条件表达式
boolean conditionMet = evaluateCondition(level.getCondition(), execution);
if (conditionMet) {
// 解析审批角色(如"DEPT_MANAGER,FINANCE_MANAGER")
String[] roles = level.getRule().split(",");
approverRoles.addAll(Arrays.asList(roles));
}
}
// 2. 从角色获取实际审批人(从组织架构服务查询)
List<String> approvers = new ArrayList<>();
for (String role : approverRoles) {
List<String> users = organizationService.getUsersByRole(role);
approvers.addAll(users);
}
// 3. 创建多实例任务(依次审批)
if (!approvers.isEmpty()) {
execution.setVariable("approvers", approvers);
execution.setVa

最低0.47元/天 解锁文章
4575

被折叠的 条评论
为什么被折叠?



