Flowable 监听器使用指南
在 Flowable 流程引擎中,监听器(Listener)是扩展流程行为的核心机制之一。它允许开发者在流程执行的特定时刻插入自定义逻辑,而无需修改 BPMN 流程图本身。Flowable 主要提供两种监听器:执行监听器(ExecutionListener)和任务监听器(TaskListener)。理解它们的区别和适用场景,是用好 Flowable 的关键。
一、执行监听器(ExecutionListener)
执行监听器关注的是流程的流转,而非用户任务本身。它监听的是流程实例在执行过程中的生命周期事件,比如流程启动、节点进入、节点结束、连线被选中。
触发事件类型:
执行监听器主要有三种事件:
| 事件 | 触发时机 | 适用元素 |
|---|---|---|
| start | 节点或流程开始执行时 | 流程、活动节点 |
| end | 节点或流程执行结束时 | 流程、活动节点 |
| take | 连线被选中通过时 | 顺序流(SequenceFlow) |
需要注意,start和end作用于流程实例和活动节点,而take只对连线有效。
可获取的值:
执行监听器的notify方法接收DelegateExecution对象,通过它你可以访问:
getProcessInstanceId()— 流程实例 IDgetProcessDefinitionId()— 流程定义 IDgetCurrentActivityName()— 当前活动节点的名称getBusinessKey()/getProcessBusinessKey()— 流程实例的业务标识getVariable(String)/getVariables()— 读取流程变量getEventName()— 当前触发的事件名称getParentId()— 父执行 ID,用于判断是否处于子流程中
典型使用场景:
执行监听器适合处理流程级别的技术逻辑,比如流程启动时初始化业务数据、节点结束时更新外部系统状态、连线被选中时记录流转日志等。由于它不直接关联用户任务,因此无法获取任务级别的信息(如候选人、办理人等)。
二、任务监听器(TaskListener)
任务监听器专门针对用户任务,监听任务自身的生命周期。如果说执行监听器关心的是“流程走到哪了”,任务监听器关心的就是“任务发生了什么”。
触发事件类型:
任务监听器的事件粒度更细:
| 事件 | 触发时机 |
|---|---|
| create | 任务被创建,所有属性设置完成后 |
| assignment | 任务被分配给某个办理人后 |
| complete | 任务完成、尚未从运行数据中删除时 |
| delete | 任务即将被删除前(正常完成也会触发) |
其中,assignment事件在create之前触发,这是因为引擎需要先确定办理人,才能保证create时任务的所有属性都已就绪。
可获取的值:
任务监听器接收DelegateTask对象,它提供了丰富的任务级信息:
getId()— 任务 IDgetName()— 任务名称getDescription()— 任务描述getAssignee()— 当前办理人getOwner()— 任务所有者getProcessInstanceId()— 所属流程实例 IDgetExecutionId()— 关联的执行 IDgetProcessDefinitionId()— 流程定义 IDgetCreateTime()— 任务创建时间getDueDate()— 任务截止日期getPriority()— 任务优先级(0-100)getVariable(String)/getVariables()— 读取流程变量getEventName()— 触发监听器的事件名称getCandidates()— 候选人/候选组集合
更重要的是,DelegateTask提供了修改任务状态的能力:setAssignee()可以动态指定办理人,addCandidateUser()/addCandidateGroup()可以添加候选人或候选组,setDueDate()可以设置截止时间。
典型使用场景:
任务监听器最适合处理与用户任务紧密相关的逻辑。最经典的用法是动态分配审批人:在任务create时,根据表单字段或流程变量计算并设置任务的办理人。其他场景包括任务创建时发送通知、任务分配后记录操作日志、任务完成前校验数据完整性等。
三、两者的核心区别
理解这两种监听器的分工,可以用一句话概括:ExecutionListener 面向流程,TaskListener 面向任务。
| 维度 | ExecutionListener | TaskListener |
|---|---|---|
| 监听对象 | 流程实例、活动节点、连线 | 用户任务 |
| 核心接口 | DelegateExecution | DelegateTask |
| 能否操作任务 | 不能 | 能(设置办理人、候选人等) |
| 能否获取任务信息 | 不能 | 能(任务名称、办理人、截止日期等) |
| 典型用途 | 流程级业务逻辑、状态同步 | 动态分配、通知、任务校验 |
在选择时,一个简单的判断标准是:如果你的逻辑需要知道“谁在处理这个任务”或者“这个任务是什么”,就用 TaskListener;如果只关心“流程走到了哪个节点”,用 ExecutionListener 即可。
四、配置方式说明
无论哪种监听器,在 BPMN 中都有三种配置方式,分别适用于不同的项目结构:
class 方式:直接指定 Java 类的全限定名。适合简单的、无需依赖注入的场景。
delegateExpression 方式:使用${beanName}指向一个 Spring Bean。在 Spring Boot 项目中推荐这种方式,因为可以方便地注入 Service、Repository 等组件。
expression 方式:直接写表达式(如${myService.process(task)})。适合逻辑简单、单次调用的场景,不建议在 expression 中写复杂业务逻辑。
五、写在最后
Flowable 的监听器机制本质上是一种事件驱动的扩展点。它把流程引擎的标准行为与业务自定义逻辑解耦开来:引擎负责流转,监听器负责在恰当的时机执行你的代码。
用好监听器的关键在于选对类型。流程级的动作交给 ExecutionListener,任务级的动作交给 TaskListener。如果混淆了两者,轻则代码别扭,重则出现“在 TaskListener 里拿不到节点信息”或者“在 ExecutionListener 里想改任务办理人改不了”的尴尬局面。
希望这份指南能帮你理清 Flowable 监听器的使用脉络。