Flowable多实例实战避坑:从‘全员审批’到‘半数通过’的完整配置与调试记录

Flowable多实例审批流程流程引擎
于 2026-05-29 11:25:04 修改
·本内容遵循CC 4.0 BY-SA版权协议

Flowable多实例实战:从全员审批到动态比例通过的深度解析

上周团队接到一个紧急需求:市场部希望将原本需要全员签字的促销方案审批流程,改为"超过半数同意即可自动推进"。听起来简单,但当我们真正在Flowable引擎上实施时,却遇到了各种预期之外的行为——有的审批人还没收到任务流程就结束了,有的明明达到了通过比例却卡住不动。经过三天密集调试,终于摸清了多实例任务的完整运作机制,今天就把这些实战经验系统梳理出来。

1. 多实例基础:不只是简单的循环

很多人把多实例简单理解为for循环,这种认知会导致后续配置出现各种偏差。本质上,Flowable的多实例机制是带有状态管理的智能任务分发系统。我们来看个典型配置:

XML
<userTask id="approvalTask" name="方案审批" flowable:assignee="${assignee}">
<multiInstanceLoopCharacteristics
isSequential="false"
flowable:collection="${approvers}"
flowable:elementVariable="assignee">
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>

这个配置会产生几个关键行为:

  • 根据approvers集合自动生成并行实例
  • 每个实例会获得独立的assignee变量
  • 当完成数达到总数60%时立即终止剩余任务

常见误区警示

  • 集合变量${approvers}必须存在于流程实例级别(而非任务局部变量)
  • 并行模式下nrOfActiveInstances不等于剩余未完成数(而是当前活跃实例数)
  • 表达式中的除法运算最好显式处理精度(建议使用>= 0.6而非> 0.5

2. 结束条件设计的五种实战模式

2.1 比例通过模式

最常用的动态阈值方案,注意分母处理的两种方式:

JAVA
// 方式一:硬编码比例
${nrOfCompletedInstances/nrOfInstances >= 0.5}
 
// 方式二:动态阈值(从业务变量读取)
${nrOfCompletedInstances/nrOfInstances >= passRate}

关键点:当审批人列表可能变化时,建议采用动态集合大小计算: ${nrOfCompletedInstances >= Math.ceil(nrOfInstances*0.5)}

2.2 一票否决模式

结合网关实现的特殊逻辑:

XML
<completionCondition>
${nrOfRejectedInstances > 0 || nrOfApprovedInstances >= requiredApprovals}
</completionCondition>

需要配合任务监听器维护nrOfRejectedInstances变量。

2.3 分级审批模式

不同级别审批人权重不同:

职级 权重 计算方式
普通 1 ∑(权重 * 同意状态)
主管 2
总监 3

对应的表达式:

JAVASCRIPT
${sumOfWeights >= totalWeights * 0.6}

2.4 时间窗口模式

在指定时间内收集足够审批:

XML
<completionCondition>
${(nrOfCompletedInstances >= minApprovals)
|| (dateCompare(now, deadline) > 0)}
</completionCondition>

2.5 混合条件模式

结合多个条件的复杂逻辑:

JAVASCRIPT
${ (nrOfCompletedInstances >= minApprovals && !hasRejection)
|| (nrOfCompletedInstances >= emergencyApprovals) }

3. 调试技巧:看不见的变量与执行流

当多实例行为不符合预期时,可以按以下步骤排查:

3.1 变量检查清单

BASH
# 查看实例变量
flowable-runtime query variables
--processInstanceId [ID]
--names nrOfInstances,nrOfActiveInstances,nrOfCompletedInstances
 
# 验证集合变量
flowable-runtime query variables
--processInstanceId [ID]
--name approvers

3.2 历史数据分析

关键表查询SQL:

SQL
SELECT * FROM ACT_HI_TASKINST
WHERE PROC_INST_ID_ = '流程实例ID'
ORDER BY START_TIME_ DESC;
 
SELECT * FROM ACT_HI_VARINST
WHERE PROC_INST_ID_ = '流程实例ID'
AND NAME_ LIKE 'nrOf%';

3.3 日志级别调整

application.properties中增加:

PROPERTIES
logging.level.org.flowable.engine.impl.persistence.entity=DEBUG
logging.level.org.flowable.task.service.impl=TRACE

典型问题诊断案例:

  • 现象:流程提前结束但未达阈值
  • 排查:检查是否有审批人重复导致nrOfInstances计数不准
  • 解决:在集合变量处理前执行去重操作

4. 高级配置:当基础功能不够用时

4.1 动态调整审批人列表

通过执行监听器实现中途增减审批人:

JAVA
public class DynamicApproverListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
if ("addApprover".equals(execution.getEventName())) {
List<String> approvers = (List<String>) execution.getVariable("approvers");
approvers.add("new_approver");
execution.setVariable("approvers", approvers);
}
}
}

4.2 多实例任务超时处理

结合边界事件实现超时自动跳过:

XML
<boundaryEvent id="timeoutEvent" attachedToRef="approvalTask">
<timerEventDefinition>
<timeDuration>PT24H</timeDuration>
</timerEventDefinition>
</boundaryEvent>

4.3 跨多实例的任务协作

通过共享变量实现实例间通信:

JAVA
// 在任务完成监听器中
execution.getEngineServices().getRuntimeService()
.setVariable(execution.getProcessInstanceId(),
"lastApprover",
execution.getVariable("assignee"));

5. 性能优化:大规模审批的实践方案

当审批人数量超过50时,需要特别考虑性能问题:

5.1 分批加载策略

XML
<multiInstanceLoopCharacteristics
flowable:collection="${approvalService.getPagedApprovers(execution, 0, 20)}"
flowable:elementVariable="assignee">
<extensionElements>
<flowable:executionListener
event="end"
class="com.example.LoadNextBatchListener"/>
</extensionElements>
</multiInstanceLoopCharacteristics>

5.2 异步化处理配置

PROPERTIES
# 启用异步多实例
flowable.async.executor.activate=true
flowable.async.executor.default.queue.size=1000

5.3 数据库优化参数

SQL
-- 增加历史表索引
CREATE INDEX IDX_HI_TASKINST_PIID ON ACT_HI_TASKINST(PROC_INST_ID_);
CREATE INDEX IDX_HI_VARINST_PIID ON ACT_HI_VARINST(PROC_INST_ID_);
 
-- 调整事务超时
SET GLOBAL innodb_lock_wait_timeout=120;

实际项目中,我们曾用这些方案处理过单流程300+审批节点的场景,平均完成时间控制在15分钟内。关键是要避免在内存中一次性加载所有审批人数据,转而采用分页查询+增量加载的方式。

Flowable工作流之多实例任务会签
本文介绍了Flowable工作流中的多实例任务会签。会签指多人审批任务,有按数量通过、按比例通过、一票否决、一票通过等类型。多实例任务会签需绘制流程图并配置节点属性,包括多实例类型、集合、元素变量等。还展示了部署启动及完成任务的过程,如三人完成任务满足条件后节点流转。
桐花思雨
10783
flowable任务节点多实例实现会签功能
本文介绍了Flowable任务节点多实例实现会签功能,包括并行(所有人审批通过、一人审批通过)、串行三种模式及动态配置。阐述了各模式下的流程定义配置、数据库变化,同时提出了如用户待办任务数量、串行任务完成条件、动态传递处理人及审批不通过处理等问题。
13272
Flowable 6.4 多实例会签 审批人设置、结果判断、会签后走向
本文深入解析Flowable工作流引擎的部署配置与多实例任务管理。重点介绍了userTask标签、TaskListener绑定、多实例特性设置及审批人分配方法。探讨了ExecutionListenerTaskListener的区别,以及多实例任务结束条件判定技巧。
gblfy
8102
基于Springboot+Flowable的工作流实战
本文详细介绍Flowable工作流引擎的使用,包括Spring Boot的集成、实战案例、流程定义及核心实现。通过一个二级审批流程,展示了如何创建流程实例、查询任务、审批流程和获取流程状态。
8134
初探Flowable流程引擎,偶遇多实例子流程
本文详细记录了一次使用Flowable流程引擎解决多实例子流程启动异常的经历。通过分析架构师提供的流程图和异常信息,找到了问题所在并提出了修改方案,最终成功启动了多个子流程实例。博客探讨了Flowable多实例任务、嵌入子流程以及动态变量初始化等概念,并提供了问题解决方案和替代实现策略。
淡泊明志-宁静致远
6453
Flowable多实例任务实战:从会签到或签的配置与变量解析
本文深入讲解Flowable工作流引擎中多实例任务的核心机制,涵盖会签或签两种典型审批模式的配置要点、完成条件设置、内置变量(如nrOfInstances、loopCounter等)解析,并针对动态审批人、超时处理、性能瓶颈及混合审批实战问题提供可落地的技术方案。
寒泊
351
flowable 实现逐级审批功能
本文介绍了两种实现多级审批的工作流方式固定审批人和多实例串行审批。固定审批人方式需预先绘制审批层级,适合界面清晰、流程明确但不支持动态调整。多实例串行则简化流程,支持动态增减审批人,但不便于固定审批人和候选组设置。两种方法各有优缺点,适用于不同场景。
青冘
10390
flowable 之驳回 多实例驳回 并行网关驳回 普通节点驳回到多实例
本文介绍了Flowable流程引擎的驳回功能,包括多实例驳回和并行网关驳回。作者强调理解源代码的重要性,并分享了具体实现代码,包括添加审批意见、删除任务、处理多实例节点等步骤。同时,文中表达了对Flowable作者的敬意,并提供了一个自定义的驳回流程。
anq7688
2326
Springboot整合Flowable并进行一个通用审批流程应用实践
本文详细介绍如何在SpringBoot项目中整合Flowable实现业务审批流程,包括流程定义、部署、模型器应用、通用审批流程设计及数据库扩展,解决多数据源冲突,并提供源码下载和实战指南。
冰之杍
15671
flowable 自定义任务者的配置【例为同节点顺序审批配置
本文介绍在Flowable流程引擎中,如何通过自定义监听器实现多级审批流程。具体实现包括配置多实例串行审批、使用表达式控制审批条件,并通过监听器动态获取审批人列表,确保按层级顺序发放任务。
yangxin_LZHH
6008
Flowable多实例实战:从循环配置到动态任务分发的完整指南
本文深入解析Flowable多实例核心机制,涵盖collection、elementVariable和isSequential三大配置要素,详解智能完成条件(如投票阈值、超时终止)运行时数据注入方法;结合监听器实现审计追踪,并针对空集合、变量作用域、事务锁等常见问题提供避坑方案;最后以智能工单分发系统为例,展示动态技能组匹配、负载均衡自动升级的完整落地实践。
weixin_30402343
395
深入理解Flowable多实例任务设置详解(会签/或签)
本文介绍了Flowable工作流引擎在Java应用中多实例任务的会签和或签模式。阐述了多实例任务概念,详细解释核心参数,通过财务审批的会签和或签示例说明参数配置,指出会签适用于需全员同意场景,或签适用于部分同意场景,合理配置可满足不同业务需求。
爱吃土豆的程序员
3492
Flowable多实例流程
本文介绍了Flowable多实例流程的应用场景,如多人同时审核、按百分比通过节点。阐述了流程图及流程设计器参数,包括多实例类型(并行和串行)和各项配置信息。还给出多个审核实例,如设置循环基数和完成条件,说明不同情况下节点通过所需的审核用户数量。
没有睡醒的狮子
7177
基于Flowable的采购审批流程实现从设计到落地
本文分享基于Flowable的采购审批流程实现方案。先阐述选择Flowable的原因,接着介绍核心功能如流程定义、动态审批人分配和审批规则引擎。还分享实战技巧,包括性能优化和功能扩展。同时提及实践中的问题及解决办法,最后展望了AI辅助决策等未来方向。
码农阿树
1238
Flowable多实例任务配置避坑指南如何避免会签功能中的重复待办问题
本文详解Flowable多实例会签中重复待办问题的成因解决方案,重点剖析parallelMultiInstanceLoopCharacteristics配置原理,对比四种主流配置模式(动态用户集、collection+elementVariable简化写法、固定基数+候选组、串行会签),强调loopCardinalityuserList长度的关系,并指导通过ACT_RU_TASK、ACT_RU_VARIABLE等运行时表验证配置正确性,涵盖拒绝处理、动态人数、空集合防护及性能优化要点。
烧烤摊在逃五花肉
736
Flowable-多实例
本文围绕Flowable流程设计器展开,介绍了BPMN中多实例活动的概念,它可让特定活动按配置重复执行。还阐述了多实例活动的类型、可设置的活动种类,重点讲解了多实例配置,包括图形标记、XML内容、数量计算、结束条件配置等,最后提供了界面操作视频教程和演示demo。
小学生05101
5676
springboot与flowable(3)启动、审批、各个Service服务
本文围绕Spring Boot与Flowable展开,介绍了流程启动、审批及各个Service服务。启动流程通过定义id创建实例,审批可查询待办信息并根据id操作。还阐述了RepositoryService、RuntimeService等7种Service服务,它们可用于工作流部署、执行和管理。
ywz大柳
1943
flowable多实例
本文深入解析多实例业务场景,如组织活动信息收集、合同审批流程及投票机制。介绍Flowable流程引擎中多实例节点的配置方法,包括串行并行处理、任务分配结束条件设定。
凌晨两点钟同学
2597
Flowable多实例加签减签避坑手册串行/并行模式下的变量更新任务异常处理
本文针对Flowable 6.4.2中串行多实例任务在动态加签/减签时产生的‘幽灵任务’、nrOfInstances计数异常、变量不同步及执行栈残留等问题,剖析其根源在于loopCounter未更新、运行时数据未清理和变量引用错误保留;提出原子化减签操作双保险变量同步机制,并封装为Spring Boot Starter,支持乐观锁、异步补偿历史写入优化,已在生产环境稳定运行半年。
丧尸225
1035
enterprise-flowable:工作流,包含单人审批、多人审批、流程分支、指定退回、流程图展示
开发者可以使用Flowable的API或服务任务来实现审批逻辑。3. **多人审批** 多人审批涉及多个参与者共同完成一个任务。
ywnwx
9685
flowable多实例串行审批驳回
本文介绍了如何使用Flowable工作流引擎实现多实例串行审批驳回流程。首先定义了流程模型,然后设置了多实例属性和驳回条件,最后通过执行流程和驳回流程来完成整个审批过程。
旺仔ZZW
flowable 多实例串行 判断还有几个审批
本文介绍了在Flowable工作流引擎中,如何通过`Execution`和`Task`类来判断多实例串行节点中剩余的审批人数。通过查询子执行实例和子任务,可以统计出未完成的实例数量,从而得知还有多少审批人需要进行审批操作。
m0_38100340
flowable 多实例并行 判断还有几个审批
本文介绍了在Flowable工作流引擎中,如何通过`Execution`和`Task`类来判断多实例并行节点中剩余的审批人数。提供了Java代码示例,展示了如何获取当前执行实例的子执行实例以及当前任务的子任务,并根据这些信息来计算还有多少个审批人未完成审批
m0_38100340
flowable多实例会签
本文详细介绍了Flowable工作流引擎中的多实例会签机制,包括如何在流程定义中使用userTask节点和multiInstanceLoopCharacteristics节点来配置多实例会签任务,以及如何通过completionCondition属性来设置任务完成条件。
qq_41655831
springboot flowable 审批记录
本文介绍了如何在Spring Boot框架中使用Flowable工作流引擎来设计、部署和管理审批流程。通过模型设计器创建审批流程模型,使用API部署和启动流程实例,并通过任务查询API管理审批任务。审批完成后,利用历史数据查询API查询审批记录,实现审批记录的管理和跟踪。
Flowable中的多实例任务完全指南
# 1. Flowable多实例任务简介## 1.1 什么是多实例任务?在Flowable中,多实例任务是指一个任务可以被多次执行的一种任务形式。它可以按照指定的方式进行重复执行,比如循环执行、并行执行等。多实例任务可以根据定义的条件,动态地创建和执行多个实例,完成一系列重复性操作。## 1.2 多实例任务的应用场景多实例任务在实际项目中有着广泛的应用场景,特别适用于需要重复执行相似操作或需要并行处理多个子任务的业务场景。比如批量审批流程、多人会签流程、并行处理流程等。## 1.3 Flowable多实例任务的优势- **灵活性**:多实例任务支持动态创建实例,灵活适
李_涛
flowable 会签 只要一人审批通过
本文介绍了在Flowable工作流中如何配置多实例任务和自定义监听器或Service Task来实现会签功能,使得只需一人审批通过即可完成任务。同时,还探讨了在复杂场景下,如何通过数据库层面的支持来追踪整个过程的历史记录
随心o
jfinal中实现flowable 审批流程
本文介绍了在JFinal框架中集成Flowable实现审批流程的方法。首先,需要引入Flowable依赖并配置数据库连接。接着,创建继承自FlowablePlugin的插件类并进行配置,包括数据库连接和流程引擎配置。然后,在JFinal配置文件中添加FlowablePlugin插件配置。创建继承自FlowableController的控制器类实现审批逻辑,使用Flowable API操作流程实例。对于多级审批,可采用多实例方式或流程中设置多个审批人。流程中可使用条件判断实现不同分支的审批逻辑。
还系要有梦想的
flowable工作流多实例并行
本文详细介绍了Flowable工作流中多实例并行的实现方式和配置方法。首先解释了多实例并行的基本概念,然后通过XML配置示例和流程设计器操作步骤,指导用户如何设置多实例属性和任务分配。文章还阐述了多实例并行的执行逻辑和特殊场景下的实现,最后提醒用户注意变量作用域、历史数据和回退限制等事项。
周小小~