事件监听器

有几种方式能处理流程引擎事件,事件是指任务创建、活动完成等。

第一种方式,可以为特定的流程节点定义一个执行监听器或者任务监听器。参阅 Flowable 文档 了解详情。

流程家默契提供配置监听器的 UI。

  • 在执行监听编辑器中,下拉列表包含实现了 org.flowable.engine.delegate.ExecutionListener 接口的类。

  • 在任务监听编辑器中,下拉列表包含实现了 org.flowable.engine.delegate.TaskListener 接口的类。如果类包含 注入字段,则这些字段会自动添加到监听编辑器的 Fields(字段) 区域。

第二种方式,可以声明由 Flowable 框架提供的全局事件监听器,参阅 事件处理器 章节。在项目属性面板中,可以在 Event listeners(事件监听器) 区域定义。

BPM 扩展组件还引入了一组 Spring 应用事件,会发布下列事件:

  • UserTaskAssignedEvent

  • UserTaskCreatedEvent

  • UserTaskCompletedEvent

  • ActivityStartedEvent

  • ActivityCompletedEvent

  • ProcessStartedEvent

  • ProcessCompletedEvent

下面示例中,每次分配用户任务时,都会发送一个 email 通知:

@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 创建并发送 email。参阅 Email 发送 了解详情。

如需在监听器中获取流程变量的值,可以这么做:

@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) {
    // ...
}