Flowable-服务-服务任务

news2024/11/15 10:57:15

文章目录

      • 定义
      • 图形标记
      • 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()方法。

界面操作

在这里插入图片描述
视频地址:
服务任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC中的相关注解

文章目录 RequestMappingGetMappingPostMappingResponseBody传参RequestParamPathVariableRequestBodyRequestPartCookieValueSessionAttributeRequestHeader总结 RequestMapping 支持 GET/POST 类型的请求。&#xff08;&#xff09;内写请求的访问地址。 即可以修饰类也可以修…

springboot2实现图片文件上传与mysql存储路径并回显

环境介绍 技术栈 springbootmybatismysql 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis 2.3.1 springboot是基于spring 4.0&#xff0c;springboot2是基于spring5.0,springboot2由pivotal公司在2018发布,这个框架主要用来…

Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

一些类型推导相关的功能(C++)

目录 auto关键的新用法&#xff08;C11起&#xff09; 背景介绍 用法示例 注意事项 typeid运算符 type_info类 typeid的用法 decltype运算符 用法阐述 用法示例 用法建议 function类模板 用法阐述 用法示例 function较函数指针的优势 std::function和decltype的…

苍穹外卖day10——订单状态定时处理(Spring Task)、来单提醒和客户催单(WebSocket)

预期效果 对于超时没处理的需要定时程序处理。基于SpringTask实现。 来单提醒和客户催单。基于WebSocket实现。 Spring Task 介绍 Cron表达式 周几通常不能和日一起指定。 cron表达式在线生成器 在线Cron表达式生成器 入门案例 创建定时任务类 /*** 定义定时任务类*/ Slf4j…

OBS推流工具介绍及桌面录屏推流功能实现

OBS推流工具介绍及桌面录屏推流功能实现 文章目录 OBS推流工具介绍及桌面录屏推流功能实现1 OBS工具介绍2 OBS工具安装及简单使用2.1 安装步骤2.2 简单使用介绍 3 OBS实现桌面录屏推流工具实现4 总结 流媒体开发工程中&#xff0c;我们除了使用ffmpeg等工具辅助调试外&#xff…

《工具箱-数据库相关》Dbeaver数据导入“CSV格式“、“Txt格式“导入配置

《工具箱-数据库相关》DBeaver线下数据导入数据库表 Dbeaver数据导入"CSV格式"、"Txt格式"导入配置 使用CSV、Txt导入的时候&#xff0c;数据格式不同&#xff0c;在导入数据的时候&#xff0c;要根据数据编码样式设置不同的配置。 一、Txt格式导入 1.1 …

汇编语言基础知识

目录 前言&#xff1a; 汇编语言的产生 汇编语言的组成 内存 指令和数据 cpu对内存的读写操作 地址总线 数据总线 控制总线 内存地址空间 前言&#xff1a; 汇编语言是直接在硬件之上工作的 编程语言&#xff0c;我们首先了解硬件系统的机构&#xff0c;才能有效地应用…

CHI中的resp type

Rsp分为4大类&#xff1b; Completion response □ 除了PCrdReturn&#xff0c;PrefetchTgt&#xff0c;其他所有的trans都需要comp resp; □ 通常是一个trans的最后一个发送的message, 来自completer; 这个响应保证trans到达了POS/POC; □ 通常RN还会发送一个compack;Read an…

pytorch深度学习快速入门

放弃个人素质 享受缺德人生 拒绝精神内耗 有事直接发疯 一、安装Anaconda 官网下载地址 选择适合的系统版本进行安装即可 安装完之后&#xff0c;可以看到下面的内容 二、使用Anaconda创建开发环境 这也是为什么要使用Anaconda的原因&#xff0c;可以创建不同的开发环境&am…

剑指offer46.把数字翻译成字符串

一开始我的想法是从后面向前面不断对100取余&#xff0c;如果这个余数大于等于10并且小于等于25&#xff0c;说明这两位既可以做一个大的字母&#xff0c;也可以做两个小的字母。所以对于前面的n-2个数字来说&#xff0c;后面的连个数字使得前面的n-2个数字的结果数翻了一倍&am…

Statefulset 实战 1

上一部分与大家分享到 Statefulset 与 RplicaSet 的区别&#xff0c;以及 Statefulset 的特点&#xff0c;能做的一些事情及一些注意事项 现在我们来尝试使用 Statefulset 来部署我们的应用&#xff0c;我们可以需要有应用程序&#xff0c;然后有持久化卷 开始使用 Statefuls…

28.利用fminsearch、fminunc 求解最大利润问题(matlab程序)

1.简述 1.无约束&#xff08;无条件&#xff09;的最优化 fminunc函数 : - 可用于任意函数求最小值 - 统一求最小值问题 - 如求最大值问题&#xff1a; >对函数取相反数而变成求最小值问题&#xff0c;最后把函数值取反即为函数的最大值。 使用格式如下 1.必须预先把函数存…

【机器学习】Gradient Descent for Logistic Regression

Gradient Descent for Logistic Regression 1. 数据集&#xff08;多变量&#xff09;2. 逻辑梯度下降3. 梯度下降的实现及代码描述3.1 计算梯度3.2 梯度下降 4. 数据集&#xff08;单变量&#xff09;附录 导入所需的库 import copy, math import numpy as np %matplotlib wi…

Django的生命周期流程图(补充)、路由层urls.py文件、无名分组和有名分组、反向解析(无名反向解析、有名反向解析)、路由分发、伪静态

一、orm的增删改查方法&#xff08;补充&#xff09; 1. 查询resmodels.表名(类名).objects.all()[0]resmodels.表名(类名).objects.filter(usernameusername, passwordpassword).all()res models.表名(类名).objects.first() # 判断&#xff0c;判断数据是否有# res如果查询…

如何通过github学生包认证(远程不在学校或在校但位置报错均可用)

如何通过github学生包认证 在经历11次被拒绝&#xff0c;查阅多方博客后&#xff0c;终于成功通过了github的学生认证&#xff0c;材料每次重复的话github又会让你提交不同的材料&#xff0c;博主最后都已经要没有材料可以证明自己是学生了&#xff0c;不得不说这个认证是真的…

git使用(由浅到深)

目录流程图 1. 分布式版本控制与集中式版本控制 1.1 集中式版本控制 集中式版本控制系统有:CVS和SVN它们的主要特点是单一的集中管理的服务器&#xff0c;保存所有文件的修订版本&#xff1b;协同开发人员通过客户端连接到这台服务器&#xff0c;取出最新的文件或者提交更新…

【C++】通讯录管理系统

1.系统功能介绍与展示 2.创建项目 3.菜单功能 代码&#xff1a; //-封装函数显示该界面 如 void showMenu() //-在main函数中调用封装好的函数 #include <iostream> using namespace std;//-菜单界面 void showMenu() {cout << "***************************…

Azure pipeline自动化打包发布

pipeline自动化&#xff0c;提交代码后&#xff0c;就自动打包&#xff0c;打包成功后自动发布 第一步 pipeline提交代码后&#xff0c;自动打包。 1 在Repos,分支里选择要触发的分支&#xff0c;这里选择cn_china,对该分支设置分支策略 2 在生产验证中增加新的策略 3 在分支安…

【Linux】yum工具的认识及使用

【Linux】yum工具的认识及使用 1.知识点补充2.yum是什么3.yum常用指令3.1查看软件安装包3.1.1关于rzsz 3.2安装软件3.3卸载软件 4.yum扩展4.1扩展14.2扩展24.3扩展3 什么是工具&#xff1f; 本质上也是指令 1.知识点补充 1.我们一般安装软件&#xff0c;是不是需要把软件安装…