服务任务
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
流程变量包含一个用户。