服务任务
Flowable 引擎提供了下列方式,可以让服务任务调用 Java 逻辑:
-
指定一个实现了
JavaDelegate或ActivityBehavior接口的类。 -
提供一个表达式,其计算结果为一个委托对象。
-
调用一个方法表达式。
参阅 Flowable 文档 了解详情。
Spring Bean 服务任务
BPM 扩展组件额外增加了一种定义服务任务的方式。你可以选择一个 Spring bean 和 bean 方法,并能为选择的方法提供参数值。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。 |
服务任务的属性面板如下:
可以在编辑器中指定字段:
在上面的例子中,我们为 addressee 字段选择了 expression 类型。manager 流程变量包含一个用户。