在使用 bpmn.js
与 Flowable
集成时,任务监听器(Task Listener)是用于处理流程任务生命周期事件的重要机制。它允许你在任务的特定阶段执行自定义逻辑,比如分配任务、创建任务或完成任务。
下面将结合 BPMN 2.0 规范和 Flowable 的实现,详细说明任务监听器的用法及其配置方式。
1. 任务监听器的基本概念
任务监听器(taskListener
)是在 BPMN 流程中为某个 userTask
定义的回调函数,当任务发生特定事件时被触发。
支持的事件类型包括:
- create:任务刚被创建时触发。
- assignment:任务被分配给某个用户或组时触发。
- completion:任务完成前触发(在完成操作之前)。
- delete:任务被删除时触发(较少使用)。
- update:任务属性更新时触发(Flowable 特有)。
2. 在 BPMN 文件中配置任务监听器
在 BPMN XML 中,你可以通过以下方式为一个 userTask
添加监听器:
<userTask id="taskId1" name="审批任务">
<extensionElements>
<flowable:taskListener event="assignment" class="com.example.AssignmentHandler"/>
<flowable:taskListener event="create" delegateExpression="${taskCreateListener}"/>
<flowable:taskListener event="completion" expression="${execution.setVariable('approved', true)}"/>
</extensionElements>
</userTask>
- 定义了一个用户任务节点,ID为"taskId1",名称为"审批任务"
<extensionElements>
中的三个监听器配置:
assignment
事件监听器:当任务被分配给处理人时触发,使用Java类com.example.AssignmentHandler
处理create
事件监听器:当任务创建时触发,使用Spring表达式${taskCreateListener}
指定的Bean处理completion
事件监听器:当任务完成时触发,执行表达式${execution.setVariable('approved', true)}
,设置流程变量"approved"为true
可选属性:
属性 | 说明 |
---|---|
event | 必填,监听的事件类型 |
class | 指定 Java 类名,需实现 org.flowable.task.service.delegate.TaskListener 接口 |
expression | 使用 EL 表达式执行逻辑 |
delegateExpression | 使用 Spring Bean 或表达式动态注入监听器实例 |
3. bpmn.js 图形界面配置任务监听器
在使用 bpmn.js
编辑 BPMN 流程图时,可以通过属性面板添加任务监听器。
示例步骤:
- 打开
bpmn.js
编辑器。 - 选择某个
User Task
。 - 在属性面板中找到
Extension Elements
。 - 添加
flowable:taskListener
:- 设置
Event
(如 assignment) - 设置
Class
或Delegate Expression
- 设置
const { modeling } = bpmnJS.get('modeling');
const elementRegistry = bpmnJS.get('elementRegistry');
const userTask = elementRegistry.get('Activity_1');
modeling.updateProperties(userTask, {
extensionElements: createTaskListeners([
{
event: 'assignment',
class: 'com.example.AssignmentHandler'
},
{
event: 'create',
delegateExpression: '${taskCreateListener}'
}
])
});
function createTaskListeners(listeners) {
const factory = bpmnJS.get('bpmnFactory');
const elements = listeners.map(listener => {
return factory.create('flowable:TaskListener', listener);
});
return factory.create('bpmn:ExtensionElements', {
values: elements
});
}
💡 注意:
flowable:taskListener
是 Flowable 特有的扩展属性,不能直接在标准 BPMN 中使用。
bpmn.js
默认不支持 Flowable 的扩展属性,需要加载对应的bpmn-moddle
插件来支持 Flowable 元素。