服务任务

Flowable 引擎提供了下列方式,可以让服务任务调用 Java 逻辑:

  • 指定一个实现了 JavaDelegateActivityBehavior 接口的类。

  • 提供一个表达式,其计算结果为一个委托对象。

  • 调用一个方法表达式。

参阅 Flowable 文档 了解详情。

Spring Bean 服务任务

BPM 扩展组件额外增加了一种定义服务任务的方式。你可以选择一个 Spring bean 和 bean 方法,并能为选择的方法提供参数值。Bean 名称和方法通过下拉列表选择。选择方法后,会展示用于输入方法参数的面板。

spring bean

Spring bean 方法的选择面板可以帮助构建一个 bean 方法调用的表达式。上面截图的内容,会生成这样的表达式:

${smpl_OrderStatusBean.setStatus(order, 'Sent')}

请注意 is var(是否变量) 复选框,主要是对字符串参数起作用。如果没有勾选,参数值会带有单引号写入结果表达式。如果勾选,则没有单引号,而是传给方法一个你提供的名称的变量。

  • ${smpl_MyBean.someMethod('description')} - 该表达式会使用字符串值 description

  • ${smpl_MyBean.someMethod(description)} - 该表达式会使用变量 description 的值。

Java 代理服务任务

如果你在 Type(类型) 下拉框中选择的是 JavaDelegate class,则会列出实现了 org.flowable.engine.delegate.JavaDelegate 接口的 Java 类列表。参阅 Flowable 文档 了解详情。

如果选择的 JavaDelegate 类包含 org.flowable.common.engine.api.delegate.Expression 类型的字段(参阅 字段注入 Flowable 文档),则字段名会展示在 Fields(字段) 表格。

如需在 JavaDelegate 的实现中使用 Spring 上下文,Java 类需添加 @Component 注解,并在建模器选择 Delegate expression

如果在 JavaDelegate 中使用了 Spring 上下文和 Flowable 字段注入,那么 bean 的 scope 必须是 prototype,需要为类增加 @Scope(BeanDefinition.SCOPE_PROTOTYPE) 注解。参阅 Flowable 文档 了解详情。

下面是发送一个 email 的 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 异步发送 email

服务任务的属性面板如下:

java delegate panel

可以在编辑器中指定字段:

editor

在上面的例子中,我们为 addressee 字段选择了 expression 类型。manager 流程变量包含一个用户。