news 2026/9/24 15:01:43

Flowable 监听器使用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flowable 监听器使用指南

Flowable 监听器使用指南

在 Flowable 流程引擎中,监听器(Listener)是扩展流程行为的核心机制之一。它允许开发者在流程执行的特定时刻插入自定义逻辑,而无需修改 BPMN 流程图本身。Flowable 主要提供两种监听器:执行监听器(ExecutionListener)任务监听器(TaskListener)。理解它们的区别和适用场景,是用好 Flowable 的关键。

一、执行监听器(ExecutionListener)

执行监听器关注的是流程的流转,而非用户任务本身。它监听的是流程实例在执行过程中的生命周期事件,比如流程启动、节点进入、节点结束、连线被选中。

触发事件类型:

执行监听器主要有三种事件:

事件触发时机适用元素
start节点或流程开始执行时流程、活动节点
end节点或流程执行结束时流程、活动节点
take连线被选中通过时顺序流(SequenceFlow)

需要注意,startend作用于流程实例和活动节点,而take只对连线有效。

可获取的值:

执行监听器的notify方法接收DelegateExecution对象,通过它你可以访问:

  • getProcessInstanceId()— 流程实例 ID
  • getProcessDefinitionId()— 流程定义 ID
  • getCurrentActivityName()— 当前活动节点的名称
  • getBusinessKey()/getProcessBusinessKey()— 流程实例的业务标识
  • getVariable(String)/getVariables()— 读取流程变量
  • getEventName()— 当前触发的事件名称
  • getParentId()— 父执行 ID,用于判断是否处于子流程中

典型使用场景:

执行监听器适合处理流程级别的技术逻辑,比如流程启动时初始化业务数据、节点结束时更新外部系统状态、连线被选中时记录流转日志等。由于它不直接关联用户任务,因此无法获取任务级别的信息(如候选人、办理人等)。

二、任务监听器(TaskListener)

任务监听器专门针对用户任务,监听任务自身的生命周期。如果说执行监听器关心的是“流程走到哪了”,任务监听器关心的就是“任务发生了什么”。

触发事件类型:

任务监听器的事件粒度更细:

事件触发时机
create任务被创建,所有属性设置完成后
assignment任务被分配给某个办理人后
complete任务完成、尚未从运行数据中删除时
delete任务即将被删除前(正常完成也会触发)

其中,assignment事件在create之前触发,这是因为引擎需要先确定办理人,才能保证create时任务的所有属性都已就绪。

可获取的值:

任务监听器接收DelegateTask对象,它提供了丰富的任务级信息:

  • getId()— 任务 ID
  • getName()— 任务名称
  • getDescription()— 任务描述
  • getAssignee()— 当前办理人
  • getOwner()— 任务所有者
  • getProcessInstanceId()— 所属流程实例 ID
  • getExecutionId()— 关联的执行 ID
  • getProcessDefinitionId()— 流程定义 ID
  • getCreateTime()— 任务创建时间
  • getDueDate()— 任务截止日期
  • getPriority()— 任务优先级(0-100)
  • getVariable(String)/getVariables()— 读取流程变量
  • getEventName()— 触发监听器的事件名称
  • getCandidates()— 候选人/候选组集合

更重要的是,DelegateTask提供了修改任务状态的能力setAssignee()可以动态指定办理人,addCandidateUser()/addCandidateGroup()可以添加候选人或候选组,setDueDate()可以设置截止时间。

典型使用场景:

任务监听器最适合处理与用户任务紧密相关的逻辑。最经典的用法是动态分配审批人:在任务create时,根据表单字段或流程变量计算并设置任务的办理人。其他场景包括任务创建时发送通知、任务分配后记录操作日志、任务完成前校验数据完整性等。

三、两者的核心区别

理解这两种监听器的分工,可以用一句话概括:ExecutionListener 面向流程,TaskListener 面向任务

维度ExecutionListenerTaskListener
监听对象流程实例、活动节点、连线用户任务
核心接口DelegateExecutionDelegateTask
能否操作任务不能能(设置办理人、候选人等)
能否获取任务信息不能能(任务名称、办理人、截止日期等)
典型用途流程级业务逻辑、状态同步动态分配、通知、任务校验

在选择时,一个简单的判断标准是:如果你的逻辑需要知道“谁在处理这个任务”或者“这个任务是什么”,就用 TaskListener;如果只关心“流程走到了哪个节点”,用 ExecutionListener 即可。

四、配置方式说明

无论哪种监听器,在 BPMN 中都有三种配置方式,分别适用于不同的项目结构:

class 方式:直接指定 Java 类的全限定名。适合简单的、无需依赖注入的场景。

delegateExpression 方式:使用${beanName}指向一个 Spring Bean。在 Spring Boot 项目中推荐这种方式,因为可以方便地注入 Service、Repository 等组件。

expression 方式:直接写表达式(如${myService.process(task)})。适合逻辑简单、单次调用的场景,不建议在 expression 中写复杂业务逻辑。

五、写在最后

Flowable 的监听器机制本质上是一种事件驱动的扩展点。它把流程引擎的标准行为与业务自定义逻辑解耦开来:引擎负责流转,监听器负责在恰当的时机执行你的代码。

用好监听器的关键在于选对类型。流程级的动作交给 ExecutionListener,任务级的动作交给 TaskListener。如果混淆了两者,轻则代码别扭,重则出现“在 TaskListener 里拿不到节点信息”或者“在 ExecutionListener 里想改任务办理人改不了”的尴尬局面。

希望这份指南能帮你理清 Flowable 监听器的使用脉络。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 14:56:54

QEMU模拟STM32实战:从LED闪烁到工业级嵌入式验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 14:56:54

FPGA_GTY_SerDes_高速串并转换技术说明

1. 概述高速串行通信的核心目标,是解决通信系统中“并行数据位宽大、走线多”与“高速传输希望减少布线数量”之间的矛盾。传统并行接口可能需要:D0 D1 D2 ... D31 CLK Control如果采用高速串行通信,则可以把多位并行数据转换为一条或少量几条…

作者头像 李华
网站建设 2026/9/24 14:55:47

十年iOS开发实战复盘:从Objective-C到Swift与跨平台演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华