执行监听器、任务监听器
这篇解决什么
在节点上挂一段 Java,让流程走到 start / end / create / complete 时回调。读完能对上菜单里的监听器模板、三种 valueType,以及改完为什么必须重新发布。
默认端口 48080,管理端前缀 /admin-api。PC 开发页 http://127.0.0.1:5800。模板在流程中心 → 流程设置 → 流程监听器。画布里的监听器面板可以手填,也可以从模板挑。
示意图:模板是设计期目录。发布后引擎按 BPMN 上的 class / expression 回调,不再回表查模板。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 模板接口 | @RequestMapping("/bpm/process-listener") | ruoyi-office/yudao-module-bpm/.../controller/admin/definition/BpmProcessListenerController.java |
| 模板表 | bpm_process_listener | .../dal/dataobject/definition/BpmProcessListenerDO.java |
| 保存校验 | class 要能加载,表达式必须 ${...} | .../service/definition/BpmProcessListenerServiceImpl.java |
| 类型 | execution / task | .../enums/definition/BpmProcessListenerTypeEnum.java |
| 值类型 | class / delegateExpression / expression | BpmProcessListenerValueTypeEnum |
| 内置任务监听 | SIMPLE 用户任务自动挂 ${bpmUserTaskListener} | .../service/task/listener/BpmUserTaskListener.java |
| 调用活动 | ${bpmCallActivityListener} | .../service/task/listener/BpmCallActivityListener.java |
| Demo | 三种执行、三种任务各一份 | .../framework/flowable/core/listener/demo/ |
| PC 列表 | 路由 /bpm/manager/process-listener | ruoyi-office-vben/apps/web-antd/src/views/bpm/processListener/index.vue |
| 选择弹窗 | 执行监听 / 任务监听分开查 | .../processListener/components/select-modal.vue |
| BPMN 面板 | ElementListeners.vue / UserTaskListeners.vue | .../bpmn-process-designer/package/penal/listeners/ |
官方菜单:2726 流程监听器。按钮 bpm:process-listener:query / create / update / delete。
只改模板不够
监听器写进 BPMN XML。保存模型再发布,运行中的实例仍走旧定义。SIMPLE 设计器不会把自定义监听器画成独立节点,复杂回调用 BPMN。
两种监听
Flowable 手册把监听分成执行监听和任务监听。菜单的「类型」对应这两类,事件下拉不一样。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 执行监听 | 流程、活动、网关的 start / end | Flowable 执行监听器 |
| 任务监听 | 用户任务 create / assignment / complete / delete / update / timeout | Flowable 任务监听器 |
BpmProcessListenerTypeEnum.TASK 的显示名写成了「任务执行器」,界面和表字段仍用 task。按任务监听理解即可。

本系统截图:流程中心 → 流程设置 → 流程监听器。类型、事件、值类型三列决定设计器能选出什么。空表也可以先「新增」再回 BPMN 面板挑选。
三种写法
保存模板时,BpmProcessListenerServiceImpl#validateCreateProcessListenerValue 会验值。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
class | 填全限定类名。执行监听必须实现 JavaDelegate,任务监听必须实现 TaskListener | DemoDelegateClassExecutionListener / DemoDelegateClassTaskListener |
delegateExpression | ${beanName},类还要注册成 Spring Bean | DemoDelegateExpressionExecutionListener |
expression | ${bean.method(execution)},普通方法即可 | DemoSpringExpressionExecutionListener |
class 找不到类 → PROCESS_LISTENER_CLASS_NOT_FOUND。接口不对 → PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR。后两种不以 ${ 开头、不以 } 结尾 → PROCESS_LISTENER_EXPRESSION_INVALID。
执行监听 Demo:
cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.demo.exection.DemoDelegateClassExecutionListener
${demoDelegateExpressionExecutionListener}
${demoSpringExpressionExecutionListener.execute(execution)}包名里的 exection 是历史拼写,不要改成 execution 再去找类。
内置监听
SIMPLE 转 BPMN 时,SimpleModelUtils 会给用户任务补 create / assignment / complete 三个任务监听,实现都是 ${bpmUserTaskListener}。调用活动补 start 执行监听 ${bpmCallActivityListener}。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 用户任务 | 创建待办、指派、完成时同步状态 | BpmUserTaskListener.DELEGATE_EXPRESSION |
| 调用活动 | 子流程启动 | BpmCallActivityListener |
自己加的监听不要覆盖这两个 Bean 名。业务回调另写类,挂到节点上。
示意图:发布切开设计和运行。改 Java 类要重启应用;改 XML 要重新发布模型。
配置与操作
管理员在 流程监听器 登记 class / expression 模板,再到 BPMN 节点挂上。SIMPLE 用户任务发布时会自动挂 ${bpmUserTaskListener},不要覆盖这个 Bean 名。
改 Java 监听实现要重启应用;只改节点上挂的表达式或类名,重新发布模型。业务回写另走 FlowBillService,不要在演示监听里写库存。
开启见 流程功能设计。截图见上文列表。
