Сервисная задача
Движок 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 содержит пользователя.