在Flowable中,监听器(Listeners)是一种非常有用的机制,可以在流程执行的关键时刻执行自定义逻辑。Flowable提供了两种类型的监听器:执行监听器(Execution Listener)和任务监听器(Task Listener)。
执行监听器(Execution Listener)
执行监听器可以附加到流程定义中的任何事件上,例如流程的开始、结束、网关的取道、活动的进入和离开等。
使用方式:
- 在BPMN模型编辑器中,右键点击要添加监听器的元素(例如开始事件、任务、网关等),选择“添加执行监听器”。
- 在属性面板中配置监听器类型(Java类、表达式、委托表达式等)。
- 实现监听器逻辑。
案例:
public class MyExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
// 获取流程变量
String variable = (String) execution.getVariable("myVariable");
// 设置流程变量
execution.setVariable("newVariable", "newValue");
// 执行其他业务逻辑
System.out.println("Execution listener triggered: " + execution.getCurrentActivityId());
}
}
在BPMN模型中配置:
- 类型:Java类
- 事件:选择相应的事件(如start、end等)
- 类:填写完整的类名(例如com.example.MyExecutionListener)
任务监听器(Task Listener)
任务监听器用于监听任务事件,如任务的创建、分配、完成等。
使用方式:
- 在BPMN模型编辑器中,右键点击用户任务,选择“添加任务监听器”。
- 在属性面板中配置监听器类型(Java类、表达式、委托表达式等)。
- 实现监听器逻辑。
案例:
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
// 设置任务办理人
delegateTask.setAssignee("user123");
// 获取任务属性
String taskName = delegateTask.getName();
// 执行其他业务逻辑
System.out.println("Task listener triggered for task: " + taskName);
}
}
在BPMN模型中配置:
- 类型:Java类
- 事件:选择相应的事件(如create、assignment、complete等)
- 类:填写完整的类名(例如com.example.MyTaskListener)
完整的监听器案例
假设有一个简单的流程,当流程开始时,我们想要记录一条日志,并且在每个用户任务创建时分配一个特定的用户。
Execution Listener
public class StartExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
System.out.println("The process has started.");
}
}
Task Listener
public class TaskAssignmentListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("specificUser");
System.out.println("Task " + delegateTask.getName() + " assigned to " + delegateTask.getAssignee());
}
}
在BPMN模型中:
- 在开始事件上添加执行监听器,并配置
StartExecutionListener
。 - 在每个用户任务上添加任务监听器,并配置
TaskAssignmentListener
。
这样,每当流程开始时,都会调用StartExecutionListener
,打印日志消息。每当用户任务创建时,都会调用TaskAssignmentListener
,将任务分配给指定的用户。