Skip to content

流程监听器 ​

一句话:流程监听器是「流程跑到某个时机时自动执行的一段代码」的登记处——登记类型(执行 / 任务)+ 事件(何时)+ 值(执行什么),然后在 BPMN 设计器里把它挂到节点上;流程跑到那个时机,引擎就会调用这段代码。

先读这条:本页登记的内容只有 BPMN 设计器会用

本页的监听器只能被 BPMN 设计器引用(节点属性面板里的「执行监听器」「任务监听器」两节)。如果你用的是简易设计器(流程模型里「流程类型」选了简易设计器),它的节点配置里那个「监听器」标签页是另一回事——那是任务创建 / 指派 / 完成时发 HTTP 通知的配置,与本页登记的监听器无关,也不读本页的数据。

用简易设计器建模的流程,用不上本页。

功能在哪 ​

  • 菜单路径:工作流程 → 流程管理 → 流程监听器
  • 地址栏路由:/bpm/manager/process-listener
  • 主要权限:bpm:process-listener:query / create / update / delete

流程监听器列表:两条演示监听器,「事件」列原样显示库里的值(租户管理员视角)

界面认识 ​

区域作用常用操作
查询区名字 / 类型「搜索」「重置」(本页没有创建时间筛选)
工具条整页级动作「新增」
列表序号 / 编号 / 名字 / 类型 / 状态 / 事件 / 值类型 / 值 / 创建时间行内「编辑」「删除」
类型列执行监听器 / 任务监听器只读
值类型列Java 类 / 表达式 / 代理表达式只读
事件列原样显示库里存的值,不做翻译只读
状态列启用 / 禁用开关点开关直接改状态

「事件」列不做字典翻译,存什么显示什么——这一点在下面那个坑里很关键:列表看着正常,不代表值是对的。

常用操作 ​

新增监听器 ​

  1. 点「新增」;
  2. 填「名字」——BPMN 设计器里挑选监听器时显示的名字;
  3. 「状态」默认已选开启;
  4. 选「类型」:执行监听器(流程 / 节点开始或结束时)或任务监听器(任务创建 / 指派 / 完成等时);
  5. 选「事件」——可选项随类型变化:执行监听器只有 2 个,任务监听器有 6 个(见下图两张);
  6. 选「值类型」:Java 类 / 表达式 / 代理表达式;
  7. 在最后一个输入框填「值」——Java 类的全限定类名,或 ${...} 表达式;
  8. 点「确 定」。

新增监听器对话框:名字 / 状态 / 类型 / 事件 / 值类型 / 值(租户管理员视角)

类型为执行监听器时,事件只有「开始」「结束」两项(租户管理员视角)

类型为任务监听器时,事件有创建 / 指派 / 完成 / 删除 / 更新 / 超时六项(租户管理员视角)

结果:列表多一行。此时它只是登记,还没挂到任何流程——要到 BPMN 设计器里挂上才生效。

挂到流程上:在 BPMN 设计器里挑 ​

  1. 打开一个「流程类型 = BPMN 设计器」的模型,进入第三步「流程设计」;
  2. 选中某个节点,在右侧属性面板展开「执行监听器」或「任务监听器」;
  3. 点面板里的选择按钮,弹出本页登记的监听器列表,选中一条即把它的类型 / 事件 / 值类型 / 值抄进该节点;
  4. 回模型页点「保 存」「发 布」。

本页的「事件」存的是中文,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 项。切换类型还会清空已选事件。

相关页面 ​