flowable监听器及其使用场景
在 Flowable 工作流引擎中,监听器(Listeners) 是扩展流程行为的关键机制,它允许开发者在流程执行的特定节点注入自定义逻辑。监听器提供了非侵入式的扩展方式,无需修改流程定义就能增强流程功能。
在流程引擎中,ExecutionListener、TaskListener 和 EventListener 是三种不同粒度的监听器,它们在作用范围、触发时机和使用场景上有显著区别。
1、ExecutionListener(执行监听器)
核心特点:绑定到流程节点(如ServiceTask、SequenceFlow)
场景:自动服务调用、动态路由决策、节点级审计日志
2、TaskListener(任务监听器)
核心特点:绑定到用户任务
场景:动态任务分配、任务通知、自动添加参与者
3、EventListener(事件监听器)
核心特点:全局监听引擎所有事件
监听事件类型(部分):
| 事件类型 | 触发时机 |
|---|---|
PROCESS_STARTED |
流程实例启动 |
TASK_CREATED |
用户任务创建 |
VARIABLE_CREATED |
流程变量创建/修改 |
ACTIVITY_COMPLETED |
节点完成 |
ENGINE_CREATED |
流程引擎初始化完成 |
场景:全流程审计跟踪、系统性能监控、安全合规检查
| 需求场景 | 推荐监听器 | 原因 |
|---|---|---|
| 处理节点进入/离开时的业务逻辑 | ExecutionListener | 直接绑定节点执行过程 |
| 动态设置任务负责人 | TaskListener | 访问任务上下文(assignee/candidate) |
| 任务创建时发送通知 | TaskListener | 精确捕获任务生命周期事件 |
| 记录所有流程启动事件 | EventListener | 全局监听,无需修改流程定义 |
| 监控敏感变量变更 | EventListener | 跨流程跟踪关键数据变化 |
| 节点级数据转换 | ExecutionListener | 在流程执行上下文中操作变量 |
| 系统性能统计 | EventListener | 聚合所有流程/任务事件数据 |
-
节点级逻辑 → ExecutionListener
-
任务级操作 → TaskListener
-
系统级监控 → EventListener
监听器的核心作用:
1. 事件驱动扩展
在流程生命周期关键点触发自定义逻辑:
-
流程实例启动/结束
-
任务创建/分配/完成
-
节点进入/离开
-
变量变更等
2. 解耦业务逻辑
将非核心流程逻辑(如通知、日志、数据分析)与核心流程分离
3. 动态行为控制
运行时动态修改流程行为:
-
动态分配任务处理人
-
基于业务条件跳过节点
-
自动填充表单数据
4. 跨流程监控
实现全局的流程审计和监控
监听器的使用场景:
1. 执行监听器(Execution Listener)
作用:监控流程节点(活动)的执行事件
事件点:
-
start:进入节点时 -
end:离开节点时 -
take:流经顺序流时public class BudgetCheckListener implements ExecutionListener { @Override public void notify(DelegateExecution execution) { // 1. 预算检查 double amount = (double) execution.getVariable("amount"); if (amount > 10000) { execution.setVariable("requireCFOApproval", true); } // 2. 自动记录审计日志 auditService.log(execution.getProcessInstanceId(), "进入预算检查节点"); } } -
作用:当监听的流程节点事件(如节点进入、离开)触发时,引擎会自动调用此方法。
-
参数:
DelegateExecution execution
封装了当前流程实例的上下文信息(如流程变量、实例ID等)。 -
步骤解析:
-
获取流程变量:
从流程上下文中读取名为"amount"的变量(通常由上游节点设置),并将其转换为double类型。 -
金额判断:
如果金额amount超过10000,则执行分支逻辑。 -
设置审批标记:
向流程上下文中写入一个布尔变量"requireCFOApproval",值为true,表示需要 CFO(首席财务官)审批。
-
-
业务含义:
实现了一个简单的预算控制规则:当金额超过阈值时,标记后续流程需要高管审批。 -
BPMN绑定:
<serviceTask id="budgetCheck" flowable:class="..."> <extensionElements> <flowable:executionListener event="start" class="com.example.BudgetCheckListener"/> </extensionElements> </serviceTask>2. 任务监听器(Task Listener)
作用:监控用户任务生命周期
事件点: -
create:任务创建时 -
assignment:任务分配时 -
complete:任务完成时 -
delete:任务删除时public class ManagerTaskListener implements TaskListener { @Override public void notify(DelegateTask task) { // 1. 自动分配任务给部门经理 String dept = (String) task.getVariable("department"); String manager = departmentService.getManager(dept); task.setAssignee(manager); // 2. 发送企业微信通知 wechatService.sendTaskAlert(manager, task.getName()); } } -
作用:当监听的用户任务事件触发时,流程引擎自动调用此方法
-
参数:
DelegateTask task
封装了当前用户任务的上下文信息(任务ID、名称、办理人、流程变量等) -
步骤解析:
-
获取部门信息:
从流程变量中读取"department"变量(字符串类型) -
查询部门经理:
通过departmentService服务根据部门名称获取对应的经理账号 -
设置任务办理人:
将查询到的经理设置为当前任务的办理人(assignee)
-
-
业务含义:
实现动态任务分配机制,根据流程中的部门信息自动确定任务负责人 -
BPMN绑定:
<userTask id="managerApproval" name="经理审批"> <extensionElements> <flowable:taskListener event="create" class="com.example.ManagerTaskListener"/> </extensionElements> </userTask>3. 事件监听器(Event Listener)
作用:全局监听引擎所有事件
事件类型:40+ 种事件(如流程启动、任务创建、变量更新等)public class GlobalAuditListener implements FlowableEventListener { @Override public void onEvent(FlowableEvent event) { // 记录所有事件到审计系统 FlowableEngineEventType type = (FlowableEngineEventType) event.getType(); if(type == FlowableEngineEventType.PROCESS_STARTED) { // 流程启动审计 auditService.logProcessStart(event); } else if(type == FlowableEngineEventType.VARIABLE_CREATED) { // 变量变更审计 auditService.logVariableChange(event); } } @Override public boolean isFailOnException() { return false; // 异常不中断流程 } }
-
功能:事件触发时的回调方法
-
参数:
FlowableEvent event(包含事件类型和上下文信息) -
处理逻辑:
-
获取事件类型:
FlowableEngineEventType type = (FlowableEngineEventType) event.getType(); -
流程启动事件处理:
当检测到PROCESS_STARTED(流程启动)事件时,调用审计服务记录流程启动 -
变量创建事件处理:
当检测到VARIABLE_CREATED(变量创建)事件时,调用审计服务记录变量变更
-
注册方式:
processEngineConfiguration.getEventDispatcher()
.addEventListener(new GlobalAuditListener());
核心应用场景:
1、动态任务分配:
// 根据角色动态分配审批人
task.setAssignee(userService.findRoleUser("finance_approver"));
2、自动数据填充:
// 任务创建时自动加载用户数据
task.setVariable("userProfile", userService.getProfile(task.getAssignee()));
3、实时通知提醒:
// 任务分配时发送通知
notificationService.send(task.getAssignee(),
"您有新任务: " + task.getName());
4、自动化审批规则:
// 金额小于5000自动通过
if (amount < 5000) {
task.setVariable("autoApproved", true);
task.complete(); // 自动完成任务
}
5、审计日志追踪:
// 记录所有关键操作
auditLog.save(
event.getProcessInstanceId(),
"TASK_COMPLETED",
task.getName()
);
6、跨系统集成:
// 流程结束时同步到ERP
erpService.createOrder(
execution.getVariable("orderDetails")
);
典型应用案例:
案例1:自动加签审批
public class AddApproverListener implements TaskListener {
@Override
public void notify(DelegateTask task) {
if ("highRisk".equals(task.getVariable("riskLevel"))) {
// 高风险任务自动添加法务审批
task.addCandidateUser("legal_advisor@company.com");
}
}
}
案例2:超时自动升级:
public class EscalationListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
if ("timeout".equals(execution.getEventName())) {
// 任务超时升级给上级
String currentAssignee = task.getAssignee();
String supervisor = orgService.getSupervisor(currentAssignee);
task.setAssignee(supervisor);
// 发送升级通知
notifyService.sendEscalation(supervisor, task);
}
}
}
案例3:合规检查拦截:
public class ComplianceCheckListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
// 反洗钱检查
if (amlService.checkHighRisk(execution.getVariables())) {
execution.setVariable("complianceBlocked", true);
throw new FlowableException("AML compliance check failed");
}
}
}更多推荐




所有评论(0)