Flowable-服务-服务任务

服务任务是一个自动化流程节点,无需人工干预,常用于调用服务。Flowable提供了通过`flowable:class`、`flowable:delegateExpression`和`flowable:expression`三种方式来指定Java调用逻辑。通过这些属性,可以定义实现JavaDelegate或ActivityBehavior接口的类,或者使用UEL表达式来执行特定方法。服务任务在流程执行时会调用指定的Java类或表达式,执行相应的业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

✨✨✨ 最好用的Flowable流程设计器


定义

服务任务(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()方法。

界面操作

在这里插入图片描述

视频地址:

服务任务

演示demo

服务任务

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值