流程监听器
一句话:流程监听器是「流程跑到某个时机时自动执行的一段代码」的登记处——登记类型(执行 / 任务)+ 事件(何时)+ 值(执行什么),然后在 BPMN 设计器里把它挂到节点上;流程跑到那个时机,引擎就会调用这段代码。
先读这条:本页登记的内容只有 BPMN 设计器会用
本页的监听器只能被 BPMN 设计器引用(节点属性面板里的「执行监听器」「任务监听器」两节)。如果你用的是简易设计器(流程模型里「流程类型」选了简易设计器),它的节点配置里那个「监听器」标签页是另一回事——那是任务创建 / 指派 / 完成时发 HTTP 通知的配置,与本页登记的监听器无关,也不读本页的数据。
用简易设计器建模的流程,用不上本页。
功能在哪
- 菜单路径:工作流程 → 流程管理 → 流程监听器
- 地址栏路由:
/bpm/manager/process-listener - 主要权限:
bpm:process-listener:query/create/update/delete

界面认识
| 区域 | 作用 | 常用操作 |
|---|---|---|
| 查询区 | 名字 / 类型 | 「搜索」「重置」(本页没有创建时间筛选) |
| 工具条 | 整页级动作 | 「新增」 |
| 列表 | 序号 / 编号 / 名字 / 类型 / 状态 / 事件 / 值类型 / 值 / 创建时间 | 行内「编辑」「删除」 |
| 类型列 | 执行监听器 / 任务监听器 | 只读 |
| 值类型列 | Java 类 / 表达式 / 代理表达式 | 只读 |
| 事件列 | 原样显示库里存的值,不做翻译 | 只读 |
| 状态列 | 启用 / 禁用开关 | 点开关直接改状态 |
「事件」列不做字典翻译,存什么显示什么——这一点在下面那个坑里很关键:列表看着正常,不代表值是对的。
常用操作
新增监听器
- 点「新增」;
- 填「名字」——BPMN 设计器里挑选监听器时显示的名字;
- 「状态」默认已选开启;
- 选「类型」:执行监听器(流程 / 节点开始或结束时)或任务监听器(任务创建 / 指派 / 完成等时);
- 选「事件」——可选项随类型变化:执行监听器只有 2 个,任务监听器有 6 个(见下图两张);
- 选「值类型」:Java 类 / 表达式 / 代理表达式;
- 在最后一个输入框填「值」——Java 类的全限定类名,或
${...}表达式; - 点「确 定」。



结果:列表多一行。此时它只是登记,还没挂到任何流程——要到 BPMN 设计器里挂上才生效。
挂到流程上:在 BPMN 设计器里挑
- 打开一个「流程类型 = BPMN 设计器」的模型,进入第三步「流程设计」;
- 选中某个节点,在右侧属性面板展开「执行监听器」或「任务监听器」;
- 点面板里的选择按钮,弹出本页登记的监听器列表,选中一条即把它的类型 / 事件 / 值类型 / 值抄进该节点;
- 回模型页点「保 存」「发 布」。
本页的「事件」存的是中文,Flowable 认的是英文——挂上也不会触发
本页「事件」下拉的选项是中文(开始 / 结束 / 创建 / 指派 / 完成 / 删除 / 更新 / 超时),提交时原样把中文存进库;而流程引擎 Flowable 识别的事件名是英文(start / end / create / assignment / complete / delete / update / timeout),后端接口的字段示例写的也是 start。两边之间没有任何转换。
后果很隐蔽:列表「事件」列原样回显中文,界面看着一切正常;但把这条监听器挂进 BPMN 后,写进流程定义的是 event="开始" 这种引擎匹配不上的值,流程跑到那个时机时监听器静默不执行——不报错、不日志,只是没反应。
怎么避开:
- 需要监听器真正生效时,不要从本页挑,直接在 BPMN 设计器的监听器面板里手工填——那个面板的事件下拉是英文
start/end,值类型 / 值也能直接填; - 本页更适合当值类型的备忘登记(记下类名、表达式),或用于不依赖事件匹配的场合;
- 已经建了的中文事件监听器,进 BPMN 面板后事件框会显示一个不在英文选项里的中文值,那就是中招的样子,改成英文即可。
上面列表截图里「事件」列的「创建」「开始」就是演示环境里两条这样的登记,供你对号入座。
编辑、状态与删除
- 行内「编辑」改各字段;改类型会把已选的「事件」清空,需要重选;
- 状态列开关直接启用 / 禁用,提示「已开启」/「已关闭」;
- 行内「删除」确认后即删,后端不校验是否有流程正引用它。删掉一个已挂进 BPMN 的监听器不影响已发布的流程定义(值在发布时已抄进 XML),但设计器里再挑就找不到了。
字段说明
| 字段 | 必填 | 取值 / 校验 | 说明 |
|---|---|---|---|
| 名字 | 是 | 「名字不能为空」 | 设计器挑选列表里显示的名字 |
| 状态 | 是 | 开启 / 关闭,默认开启 | — |
| 类型 | 是 | 「类型不能为空」;执行监听器 / 任务监听器 | 决定事件的可选项 |
| 事件 | 是 | 「监听事件不能为空」;执行:开始 / 结束;任务:创建 / 指派 / 完成 / 删除 / 更新 / 超时 | 存中文,引擎认英文,见上方 danger |
| 值类型 | 是 | 「值类型不能为空」;Java 类 / 表达式 / 代理表达式 | 决定「值」怎么被引擎解释 |
| 值 | 是 | 「值不能为空」 | 类的全限定名或 ${...} 表达式 |
值类型选「Java 类」时,输入框标签仍是「表达式」
表单里最后一个输入框本该随值类型在「类路径」和「表达式」之间切换,但切换条件写错,实际永远显示「表达式」。选「Java 类」时往这个框里填类的全限定名即可,标签不用管。
视角对照
| 视角 | 看到什么 |
|---|---|
超管 admin / 租户管理员 docadmin | 全部监听器,可增删改 |
| 套餐未含此菜单的租户 | 侧边栏没有「流程监听器」 |
| 普通员工 | 无此菜单。监听器是开发向配置项,通常由开发登记类名 / 表达式 |
进阶
- 执行监听器 vs 任务监听器:执行监听器挂在流程 / 网关 / 节点上,时机是「开始 / 结束」;任务监听器挂在用户任务上,时机是任务的创建、指派、完成等生命周期点。要「任务一生成就通知某人」用任务监听器的「创建」;
- 三种值类型:Java 类 = 引擎 new 一个类实例调用;表达式 = 调 Spring Bean 的方法(如
${demoService.execute(execution)});代理表达式 = 由容器管理的 Bean 实例。表达式最常用,因为能直接注入 Spring Bean; - 监听器的代码要真正存在:值里写的类或 Bean 必须由后端提供,写错类名在流程跑到时才报,不在保存时报。
常见问题
Q:为什么我的监听器挂上后没反应? A:先看「事件」是不是中文(本页建的默认就是)。中文事件引擎匹配不上,会静默跳过。改法见上方 danger 框。
Q:简易设计器的流程能用监听器吗? A:本页的监听器不能。简易设计器节点配置里的「监听器」标签页是 HTTP 回调(任务创建 / 指派 / 完成时 POST 一个地址),与本页无关。
Q:改了监听器的值,已发布的流程会变吗? A:不会。监听器的值在发布时抄进流程定义 XML,之后改本页只影响以后新挂的节点;要让存量流程生效需重新在设计器里挂一次并重新发布。
Q:事件下拉为什么有时 2 项有时 6 项? A:随「类型」变:执行监听器 2 项(开始 / 结束),任务监听器 6 项。切换类型还会清空已选事件。
