Слушатели событий

Существует несколько подходов к обработке событий механизма процессов, таких как создание задачи, завершение операции и т.д.

Во-первых, можно определить слушателя выполнения или слушателя задачи для определенного узла процесса. Подробнее см. в документации Flowable.

Моделер процессов предоставляет UI для настройки слушателей.

  • В редакторе слушателя завершения выпадающий список содержит классы, реализующие интерфейс org.flowable.engine.delegate.ExecutionListener.

  • В редакторе слушателя задачи выпадающий список содержит классы, реализующие интерфейс org.flowable.engine.delegate.TaskListener. Если класс содержит инжектированные поля, то они будут автоматически добавлены в раздел Fields редактора слушателя.

Второй подход — объявить глобальные слушатели событий, предоставляемые фреймворком Flowable, см. раздел Event handlers. Их можно определить в разделе 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 получает имя пользователя и адрес электронной почты. UserTaskAssignedEvent содержит username пользователя, которому назначена задача.
4 Содержит UserTaskAssignedEvent объект Task, который содержит информацию о пользовательской задаче.
5 Создает и отправляет письмо. Подробнее см. в Email Sending.

Если вам нужно получить в слушателе значение переменной процесса, то это можно сделать следующим образом:

@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 Expression Language) для обработки события:

@EventListener(condition = "#event.processDefinitionData.key == 'order-approval'")
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
    // ...
}