Сервисная задача
Движок Flowable предоставляет следующие способы объявить, как логика Java должна вызываться для сервисной задачи:
-
Указание класса, который реализует
JavaDelegate
илиActivityBehavior
. -
Анализ выражения, которое разрешается в объект делегирования.
-
Вызов выражения метода.
Подробнее см. в документации Flowable.
Сервисная задача Spring Bean
Дополнение BPM добавляет еще один способ определения сервисной задачи. Он позволяет выбрать бин Spring, метод бина и указать значения параметров для выбранного метода. Имя бина и методы выбираются в выпадающих списках. После выбора метода отображается панель для ввода значений аргументов метода.
Панель для бинов Spring поможет построить выражение для вызова метода. В случае метода со скриншота выражение будет таким:
${smpl_OrderStatusBean.setStatus(order, 'Sent')}
Обратите внимание на флажок is var. В основном он применяется для строковых параметров. Если флажок не установлен, то значение аргумента будет записано в результирующее выражение в апострофах. Если флажок установлен, апострофы добавляться не будут, и в метод будет передана переменная с заданным именем.
-
${smpl_MyBean.someMethod('description')}
– это выражение будет использовать строковое значениеdescription
. -
${smpl_MyBean.someMethod(description)}
– это выражение будет использовать значение переменной с именемdescription
.
Сервисная задача делегата Java
Если выбрать JavaDelegate class
в выпадающем списке Type, то появится список классов, реализующих интерфейс org.flowable.engine.delegate.JavaDelegate
. См. документацию Flowable для более подробной информации.
Если выбранный класс JavaDelegate содержит поля типа org.flowable.common.engine.api.delegate.Expression
(см. Field Injection в документации Flowable), то имена полей появятся в таблице Fields.
Если вы хотите использовать контекст Spring в реализации JavaDelegate
, добавьте аннотацию @Component
и выберите Delegate expression
в средстве моделирования.
Если вы используете инжектирование поля Flowable в JavaDelegate
с контекстом Spring, то область действия бина должна быть установлена в prototype
— добавьте аннотацию @Scope(BeanDefinition.SCOPE_PROTOTYPE)
. Подробнее см. в документации Flowable.
Вот пример класса Java, который отправляет электронное письмо:
@Component("smpl_SendEmailJavaDelegate")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class SendEmailJavaDelegate implements JavaDelegate {
private Expression addressee; (1)
private Expression emailSubject;
private Expression emailBody;
@Autowired
private Emailer emailer;
@Override
public void execute(DelegateExecution execution) { (2)
User addresseeValue = (User) addressee.getValue(execution); (3)
String emailSubjectValue = (String) emailSubject.getValue(execution);
String emailBodyValue = (String) emailBody.getValue(execution);
EmailInfo emailInfo = EmailInfoBuilder.create() (4)
.setAddresses(addresseeValue.getEmail())
.setSubject(emailSubjectValue)
.setFrom(null)
.setBody(emailBodyValue)
.build();
emailer.sendEmailAsync(emailInfo); (5)
}
}
1 | Мы объявляем три поля. Значения полей определены в модели процесса. |
2 | Метод execute вызывается, когда процесс достигает сервисной задачи. |
3 | Анализ значения выражения. |
4 | Создание объекта EmailInfo . |
5 | Асинхронная отправка письма. |
Панель свойств сервисной задачи выглядит так:
Указать поля можно в редакторе:
В приведенном выше примере мы выбрали для поля addressee
тип expression
. В нашем случае переменная процесса manager
содержит пользователя.