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