Слушатели событий
Существует несколько подходов к обработке событий механизма процессов, таких как создание задачи, завершение операции и т.д.
Во-первых, можно определить слушателя выполнения или слушателя задачи для определенного узла процесса. Подробнее см. в документации 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) {
// ...
}