事件监听器
流程引擎事件(如,任务创建、活动完成等),可以通过几种方式进行处理。
执行监听器
可以为特定流程节点定义执行监听器。参阅 Flowable 文档。
流程建模器提供了用于配置监听器的 UI。
在执行监听器编辑器中,下拉列表包含实现了 org.flowable.engine.delegate.ExecutionListener 接口的类。
任务监听器
在任务监听器编辑器中,下拉列表包含实现了 org.flowable.engine.delegate.TaskListener 接口的类。如果类包含 注入字段,这些字段会自动添加到编辑器的 Fields 部分。
全局事件监听器
第二种方式是声明由 Flowable 框架提供的全局事件监听器,参阅 Flowable 文档的 事件处理器 章节。可以在项目属性面板的 Event listeners 中定义。
BPM 中的 Spring 事件
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) {
// ...
}