事件监听器
流程引擎事件(如,任务创建、活动完成等),可以通过几种方式进行处理。
首先,可以为特定流程节点定义执行监听器或任务监听器。参阅 Flowable 文档。
流程建模器提供了用于配置监听器的 UI。
-
在执行监听器编辑器中,下拉列表包含实现了
org.flowable.engine.delegate.ExecutionListener
接口的类。 -
在任务监听器编辑器中,下拉列表包含实现了
org.flowable.engine.delegate.TaskListener
接口的类。如果类包含 注入字段,这些字段会自动添加到编辑器的 Fields 部分。
第二种方式是声明由 Flowable 框架提供的全局事件监听器,参阅 Flowable 文档的 事件处理器 章节。可以在项目属性面板的 Event listeners 中定义。
BPM 扩展组件还引入了一组 Spring 应用程序事件。会发布以下事件:
-
UserTaskAssignedEvent
- 用户任务分配 -
UserTaskCreatedEvent
- 用户任务创建 -
UserTaskCompletedEvent
- 用户任务完成 -
ActivityStartedEvent
- 活动启动 -
ActivityCompletedEvent
- 活动完成 -
ProcessStartedEvent
- 流程启动 -
ProcessCompletedEvent
- 流程完成
下面是一个事件监听器示例,该监听器在每次将用户任务分配给用户时会发送电子邮件通知:
@Component("smpl_TaskAssignedNotificationSender")
public class TaskAssignedNotificationSender {
@Autowired
private Emailer emailer;
@Autowired
private DataManager dataManager;
@EventListener (1)
public void onTaskAssigned(UserTaskAssignedEvent event) { (2)
User user = dataManager.load(User.class) (3)
.query("select u from smpl_User u where u.username = :username")
.parameter("username", event.getUsername())
.one();
Task task = event.getTask(); (4)
String emailTitle = "New process task " + task.getName();
String emailBody = "Hi " + user.getFirstName() + "\n" +
"The task " + task.getName() + " has been assigned.";
EmailInfo emailInfo = EmailInfoBuilder.create()
.setAddresses(user.getEmail())
.setSubject(emailTitle)
.setFrom(null)
.setBody(emailBody)
.build();
emailer.sendEmailAsync(emailInfo); (5)
}
}
1 | 表示该方法是一个事件监听器。 |
2 | 当 UserTaskAssignedEvent 事件发布时触发该方法。 |
3 | 获取 User 实体,得到用户的姓名和 email 地址。UserTaskAssignedEvent 中包含任务执行人的 username 。 |
4 | UserTaskAssignedEvent 中还包含一个 Task 对象,包含用户任务的信息。 |
5 | 创建并发送邮件。参考 发送电子邮件指南。 |
如果需要在监听器中获取流程变量,可以按如下方法:
@Autowired
private RuntimeService runtimeService;
@EventListener
public void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
Order order = (Order) runtimeService.getVariable(event.getTask().getExecutionId(), "order");
// ...
}
默认情况下,在任何流程中为用户分配任务时,都会触发监听器。如果只想在特定的流程定义中发送通知,可以在监听器方法中检查流程定义:
@EventListener
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
if ("order-approval".equals(event.getProcessDefinition().getKey())) {
// ...
}
}
或者可以定义一个 SpEL(Spring 表达式语言)的表达式,匹配特定的事件:
@EventListener(condition = "#event.processDefinitionData.key == 'order-approval'")
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
// ...
}