Сервисная задача

Движок Flowable предоставляет следующие способы объявить, как логика Java должна вызываться для сервисной задачи:

  • Указание класса, который реализует JavaDelegate или ActivityBehavior.

  • Анализ выражения, которое разрешается в объект делегирования.

  • Вызов выражения метода.

Подробнее см. в документации Flowable.

Сервисная задача Spring Bean

Дополнение BPM добавляет еще один способ определения сервисной задачи. Он позволяет выбрать бин Spring, метод бина и указать значения параметров для выбранного метода. Имя бина и методы выбираются в выпадающих списках. После выбора метода отображается панель для ввода значений аргументов метода.

spring bean

Панель для бинов 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 Асинхронная отправка письма.

Панель свойств сервисной задачи выглядит так:

java delegate panel

Указать поля можно в редакторе:

editor

В приведенном выше примере мы выбрали для поля addressee тип expression. В нашем случае переменная процесса manager содержит пользователя.