文章目录
- 定义
- 图形标记
- XML内容
- 界面操作
定义
服务任务(Service Task)是一个自动化任务,无须人为参与,一般被用作调用服务。当流程执行到服务任务
时,可以自动执行编写的 Java 程序实现自定义的业务逻辑,完毕后继续执行后继路线。
图形标记
服务任务显示成一个普通任务(圆角矩形),左上角有一个小齿轮图标,如图所示:
XML内容
服务任务由 serviceTask 元素定义,Flowable 提供了 3 种方法来声明 java 调用逻辑。
1、通过 flowable:class 属性指定一个 Java 类
通过这种方式指定一个在流程执行时调用的 Java 类,需要在 serviceTask 的 flowable:class 属性中
指定合法的全路径类名,该类必须实现 JavaDelegate 或者 ActivityBehavior 接口。
1.1、指定为实现了 JavaDelegate 接口的类
<serviceTask id="serviceTask1" name="服务任务" flowable:class="xxx.xxx.xxx.MyJavaDelegate" />
其中通过 flowable:class 属性指定了调用 Java 类为 xxx.xxx.xxx.MyJavaDelegate,它实现了
org.flowable.engine.delegate.JavaDelegate 类,并重写了 execute 方法:
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
public class MyJavaDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
//编写自己的逻辑
}
}
1.2、指定为实现了 ActivityBehavior 接口的类
<serviceTask id="serviceTask2" name=" " flowable:class="xxx.xxx.xxx.MyActivityBehavior" />
其中通过 flowable:class 属性指定了调用 Java 类为 xxx.xxx.xxx.MyActivityBehavior,它实现了
org.flowable.engine.impl.delegate.ActivityBehavior 类,并重写了 execute 方法:
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.impl.delegate.ActivityBehavior;
public class MyActivityBehavior implements ActivityBehavior {
@Override
public void execute(DelegateExecution execution) {
//编写自己的逻辑
}
}
通过 flowable:class 属性指定的 Java 类,当流程执行到服务节点时,会调用其 execute 方法执行
定义好的业务逻辑,然后按照默认 BPMN 2.0 中的方式离开该节点。在 execute 方法中如果要用到流程实
例、流程变量等,可以通过 DelegateExecution 进行来获取和操作。
需要注意的是,服务任务通过 flowable:class 属性指定的 Java 类只会创建一个实例,即只在第一
次调用时实例化一个对象,该对象会被复用,而不是每次都会实例化一个对象。所有的流程实例都
会共享相同的类实例,并调用其 execute(DelegateExecution)方法。这就意味着,该 Java 类不能使用
任何成员变量,必须是线程安全的,因为它可以从不同的线程同时执行。这也影响着属性注入的处
理方式,下一节会进行介绍.
流程定义中由服务任务使用 flowable:class 属性指定的类不会在流程部署时实例化。只有当流程
执行第一次到达调用该类的服务节点时,才会创建该类的一个实例。如果找不到类,会抛出一个
FlowableException 异常。
2、通过 flowable:delegateExpression 使用委托表达式指定
可以使用解析为对象的表达式来指定,该对象必须遵循与使用 flowable:class 属性时创建的对象
相同的规则。
<serviceTask id="serviceTask3" name="服务任务" flowable:delegateExpression="${delegateExpressionBean}" />
其中通过 flowable:delegateExpression 属性指定了委托表达式为${delegateExpressionBean},
delegateExpressionBean 是一个实现了 JavaDelegate 接口的 bean,表达式调用之前需要将它初始化到
流程变量中,或者定义在实例的 spring 容器中。委托表达式中只用写 bean 的名称,不需要写方法
名,引擎会自动调用其 execute 方法。
3、通过 flowable:expression 属性使用 UEL 表达式指定
可以通过 flowable:expression 属性指定为 UEL 方法表达式或值表达式,调用一个普通 java bean
的方法或属性,表达式调用之前需要将它初始化到流程变量中,或者定义在实例的 spring 容器中。
这个 bean 不需要实现 org.flowable.engine.delegate.JavaDelegate 接口,表达式中必须指定调用的方法名或属性名。
可以通过flowable:resultVariable=“totalMount” 指定返回结果赋值到变量中
3.1、指定为 UEL 方法表达式
表达是可以为无参表达式:
<serviceTask id="serviceTask4"
name="服务任务"
flowable:expression="${businessBean.calculateMount1()}"
flowable:resultVariable="totalMount"/>
上述服务任务定义表示调用 businessBean 对象的 calculateMount1(无参数)方法。
也可以为表达式中的方法传递参数:
<serviceTask id="serviceTask5"
name="服务任务"
flowable:expression="${businessBean.calculateMount2(execution, money)}" />
上述服务任务定义表示会调用 businessBean 对象的 calculateMount2 方法,该方法第一个参数
是 DelegateExecution,在表达式环境中默认名称为 execution,第二个参数传递的是当前流程的名为
money 的变量。
3.2、指定为 UEL 值表达式
<serviceTask id="serviceTask6"
name="服务任务"
flowable:expression="#{businessBean.total}" />
上述服务任务定义会获取 businessBean 的 total 字段的值,实质是调用其 getTotal()方法。
界面操作
视频地址:
服务任务