事件监听器

流程引擎事件(如,任务创建、活动完成等),可以通过几种方式进行处理。

首先,可以为特定流程节点定义执行监听器或任务监听器。参阅 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) {
    // ...
}