Flowable-服务-服务任务

✨✨✨ 最好用的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流程引擎

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 在Flowable中,delegateExecution是一个接口,用于在流程执行过程中处理事件和执行自定义逻辑。当一个子流程实例被创建时,可以使用delegateExecution.getParentId()方法来获取该子流程的父流程实例ID。使用delegateExecution.getProcessEngineServices().getRuntimeService().createExecutionQuery()方法,可以创建一个ExecutionQuery对象,用于查询所有与当前流程实例相关的执行实例。而使用delegateExecution.getProcessEngineServices().getRuntimeService().createProcessInstanceQuery()方法,则可以创建一个ProcessInstanceQuery对象,用于查询所有与当前流程实例相关的流程实例。这些方法可以在处理事件或执行自定义逻辑时使用,以获取与当前流程实例相关的信息。 ### 回答2: Flowable delegateExecution中的parent属性是指当前执行的流程实例的父级执行。在流程中,一个流程实例可以由多个子流程实例组成,其中每个子流程实例又可以有自己的子流程实例。通过parent属性,可以方便地获取当前执行流程实例的父级流程实例。 通过delegateExecution.getParent()方法可以获取父级执行流程实例。在使用时,可以将其用于获取父级执行流程实例的相关信息,如父级流程实例的ID、名称等。通过这些信息,可以对父级流程实例进行操作,比如获取其变量、审批记录等等。 使用parent属性还可以实现流程层级控制和协同处理。例如,在一个采购流程中,可以设置一个父级流程实例来管理整个采购流程,然后在子流程中进行具体的采购事项。通过parent属性,可以将子流程实例与父级流程实例关联起来,实现流程的层级管理。同时,在子流程中可以使用parent属性获取父级流程实例的变量信息,将其传递给子流程,从而实现协同处理。 总之,Flowable delegateExecution中的parent属性是用于获取当前执行流程实例的父级流程实例的属性。通过它,可以方便地获取父级流程实例的相关信息,并进行流程层级控制和协同处理。 ### 回答3: Flowable delegateExecution parent是指在Flowable流程中,获取当前执行任务的父级执行对象。 在Flowable流程中,每个执行任务都有一个对应的Execution对象,该对象存储了当前任务的执行信息。在Flowable中,每个执行任务都可以通过delegateExecution对象来获取和修改当前任务的执行信息。而delegateExecution.parent方法,即为获取当前执行任务的父级执行对象的方法。 父级执行对象指的是当前执行任务的上一级执行任务对象,即该任务的直接上级任务。通过调用delegateExecution.parent()方法,可以获取到当前任务的父级执行对象,进而获取父级任务的相关信息。 通过获取父级执行对象,可以实现在Flowable流程中的任务层级关系的查找和操作。例如,可以通过获取父级执行任务对象,获取上一级任务的执行信息,进而判断上一级任务的状态和结果,并在当前任务中根据上一级任务的状态和结果进行相应的处理。 总之,Flowable delegateExecution parent方法是在Flowable流程中获取当前执行任务的父级执行对象的方法,通过该方法可以实现对任务执行层级关系的查找和操作,进而实现任务之间的协调和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值