Event Listeners
Существует несколько подходов к обработке событий процессов, таких как создание задачи, завершение операции и т.д.
Первый подход состоит в определении слушателя выполнения или слушателя задачи для определённого узла процесса. Подробее см. в документации Flowable.
Моделер процессов предоставляет UI для настройки слушателей.
- 
В редакторе слушателя завершения выпадающий список содержит классы, реализующие интерфейс org.flowable.engine.delegate.ExecutionListener.
- 
В редакторе слушателя задачи выпадающий список содержит классы, реализующие интерфейс org.flowable.engine.delegate.TaskListener. Если класс содержит инжектированные поля, то они будут автоматически добавлены в раздел Fields редактора слушателя.
Второй подход – объявить глобальные слушатели событий, предоставляемые фреймворком Flowable, см. раздел Event handlers в документации 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 | Аннотация @EventListenterуказывает что метод является слушателем события. | 
| 2 | Слушатель срабатывает всякий раз когда публикуется событие UserTaskAssignedEvent. | 
| 3 | Загрузка экземпляра сущности Userс указанным именем пользователя (username). Значениеusernameсодержит имя пользователя которому назначена задача, оно передается из событияUserTaskAssignedEvent. | 
| 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())) {
        // ...
    }
}По умолчанию слушатель срабатывает, когда в любом процессе назначается пользовательская задача. Если вы хотите отправлять уведомления только для конкретного определения процесса, вы можете проверить определение процесса в теле метода слушателя;
@EventListener(condition = "#event.processDefinitionData.key == 'order-approval'")
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
    // ...
}