springboot与flowable(3):启动、审批、各个Service服务

一、启动流程      

        流程定义与实例的关系类似于Java的类与对象,通过定义的id创建流程实例,编写测试代码:

package org.example.flowabledemo2;import org.flowable.engine.RuntimeService;
import org.flowable.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class ProcessTest {@Autowiredprivate RuntimeService runtimeService;/*** 发起流程*/@Testpublic void startProcess() {String id = "FirstFlow:1:95cad374-2702-11ef-8d5d-644ed7087863";// 根据流程定义ID启动流程 ProcessInstance processInstance = runtimeService.startProcessInstanceById(id);}
}

        运行测试后,在act_ru_task中可以查看到正在执行的流程信息。

        每启动一个流程会在act_hi_procinst表中多一条启动记录,然后会在act_ru_execution表中记录流程的分支。

二、流程审批

        查询待办信息并根据id审批任务:

package org.example.flowabledemo2;import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class ProcessTest {@Autowiredprivate TaskService taskService;/*** 根据用户查询待办信息*/@Testpublic void findFlow() {// 获取到 act_ru_task 中 assignee 字段是 zhangsan 的信息List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").list();// 获取该用户待办事项System.out.println(list);// 根据id进行审批for (Task task : list) {// 根据Id审批任务taskService.complete(taskId);}}
}

        运行后查看act_ru_task表,任务进度到达了经理审批。

        在通过lisi用户查询任务进行审批,查看act_ru_task表已空,说明已经没有待办任务了。

三、各个Service服务

        Service是工作流引擎提供用于进行工作流部署、执行、管理的服务接口,我们使用这些接口可以操作服务对应的数据库。所有Service都可以通过ProcessEngine获取,springboot中也可以通过自动注入获取。

1、RepositoryService

        Flowable资源管理类。很可能是使用 Flowable 引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments) 与流程定义 (process definitions) 的操作。

2、RuntimeService

        Flowable流程运行管理类。与提供静态信息(也就是不会改变,至少不会经常改变的信息)RepositoryService 相反, 用于启动流程定义的新流程实例。

3、TaskService

        Flowable任务管理类。 对于像 Flowable 这样的 BPM 引擎来说,核心是需要人类用户操作的任务。所有任务相关的东西都组织在 TaskService 中,例如:查询分派给用户或组的任务创建独立运行 (standalone) 任务。这是一种没有关联到流程实例的任务。决定任务的执行用户 (assignee) ,或者将用户通过某种方式与任务关联。认领 (claim) 与完成 (complete) 任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指 “ 做这个任务要求的工作 ” ,通常是填写某个表单。

4、IdentityService

        它用于管理(创建,更新,删除,查询 …… )组与用户。请注意, Flowable 实际上在运行时并不做任何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户。这是因为 Flowable 有时要与 LDAP 、 Active Directory 等服务结合使用。

5、FormService 

        是可选服务。也就是说 Flowable 没有它也能很好地运行,而不必牺牲任何功能。这个服务引入了开始表单(start form)与任务表单 (task form) 的概念。 开始表单是在流程实例启动前显示的表单,而任务表单是用户完成任务时显示的表单。 Flowable 可以在 BPMN 2.0 流程定义中定义这些表单。表单服务通过简单的方式暴露这些数据。再次重申,表单不一定要嵌入流程定义,因此这个服务是可选的。

6、HistoryService

        暴露 Flowable 引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。

7、ManagementService

        通常在用 Flowable 编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业 (job) 的查询与管理操作。 Flowable 中很多地方都使用作业,例如定时器 (timer) ,异步操作 (asynchronouscontinuation) ,延时暂停 / 激活 (delayed suspension/activation) 等等。

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

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

相关文章

浅谈Promise、Async和Await

Promise 1、Promise 是异步编程的一种解决方案&#xff0c;本质是一个构造函数。使用Promise&#xff0c;可以避免“回调地狱”&#xff0c;即多层嵌套的回调函数&#xff0c;从而使代码更加清晰和易于维护 2、有三种状态&#xff1a;pending&#xff08;进行中&#xff09;、f…

Github上前十大开源Rust项目

在github上排名前十的Rust开源项目整理出来与大家共享&#xff0c;以当前的Star数为准。 Deno Deno 是 V8 上的安全 TypeScript 运行时。Deno 是一个建立在V8、Rust和Tokio之上的 JavaScript、TypeScript 和 WebAssembly 的运行时环境&#xff0c;具有自带安全的设置和出色的开…

Pikachu靶场--XSS

参考借鉴 Pikachu靶场之XSS漏洞详解_pikachu xss-CSDN博客 【皮卡丘03】一个视频讲清楚XSS跨站脚本_bilibili 反射型xss(get) 输入payload&#xff1a;<script>alert(123)</script> 解决一&#xff1a;在URL框内输入 解决二&#xff1a;修改最大长度 再次输入paylo…

【秋招突围】2024届秋招笔试-小红书笔试题-第三套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

YOLOV1-V3详细介绍(新手向、超详细)

本文主要是根据我自己的学习情况来进行讲解&#xff0c;以一个初学者的角度进行阐释&#xff0c;如果有更深层次的点没有涉及到&#xff0c;还请大家多多包涵。 目录 计算机视觉 主流算法 Two-stage&#xff08;双阶段&#xff09; One-stage&#xff08;单阶段&#xff09; …

Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解 | Deep Dive系列

编辑&#xff1a;SelectDB 技术团队 在当今数据驱动的时代&#xff0c;如何高效、有序地管理数据库中的海量数据成为挑战。为了处理庞大的数据集&#xff0c;分布式数据库引入了类似分区和分桶策略&#xff0c;通过将数据按特定规则划分成较小的单位并分布到不同节点上&#x…

时间序列论文标准数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 随着时间序列问题的复杂度逐渐提高&#xff0c;研究者们开始关注非线性和多变量问题。近年来&#xff0c;时间序列领域涌现出众多基于深度学习的先进框架&#xff0c;如Transformer、GNN、TCN、…

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的&#xff1a;在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框&#xff0c;勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…

java如何实现字符串替换

java要把指定的字符序列替换为新的字符序列&#xff0c;可以用replace语句 语法如下 str.replace(老字符序列,新字符序列) 这个语句最后是返回替换后的新字符串 示例代码如下 public class Stringreplace {public static void main(String[] args) {String str"登陆功…

clickhouse日常使用

ck高阶函数运用 数组函数 对数据中的特殊字符串进行替换&#xff0c;并根据分隔符进行切割&#xff0c;过滤掉为空的数组数据&#xff0c;对数据元素进行排序&#xff0c;在用分隔符拼接。 arrayStringConcat( arraySort( arrayDistinct( arrayFilter(o -> o ! , sp…

AI存储解决案例分享

AI数据管道&#xff08;Data Pipeline&#xff09;是指在AI项目中&#xff0c;数据从原始状态到最终可用模型的整个处理流程&#xff0c;包括数据采集、清洗、转换、分析、训练模型、验证模型直至部署和监控等多个环节。 在AI训练和推理过程中&#xff0c;多个管道可能同时读取…

使用 C# 进行面向对象编程:第 10 部分

封装和抽象之间的区别 对于 OOP 初学者来说&#xff0c;封装和抽象之间存在非常基本的区别。他们可能会对此感到困惑。但如果你详细了解这两个主题&#xff0c;就会发现它们之间存在巨大差异。 抽象意味着向用户隐藏不必要的数据。用户只需要所需的功能或根据其需求的输出。例…

Redis学习(11)|Redis键值管理与Spring Boot集成实战

文章目录 引言Redis键值管理概述Spring Boot中使用`RedisTemplate`进行键值管理结论键的生命周期管理,TTL(Time To Live)和过期策略,以及如何批量处理键。 引言 Redis是一款高性能的键值存储系统,以其速度、灵活性和丰富的数据结构而著称。键值管理是Redis的核心功能之一…

Flask-RQ

Flask-RQ库教程 Flask-RQ 是一个用于在 Flask 应用中集成 RQ&#xff08;Redis Queue&#xff09;的扩展。RQ 是一个简单的 Python 库&#xff0c;用于将任务排入 Redis 队列并异步执行这些任务。这对于处理长时间运行的任务&#xff08;如发送电子邮件、生成报告等&#xff0…

修改ppt注册表,导出高分辨率图片

参考&#xff1a;PPT中导出高分辨率图片的方法 修改ppt注册表&#xff0c;导出高分辨率图片&#xff1a;【具体步骤】 1、运行-输入regedit&#xff0c;打开注册表编辑器&#xff1b; 2、找到ppt中选项&#xff0c;按下面路径找。 3、鼠标右键新建-DWORD(32位)(D)&#xff0c…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

React@16.x(31)useLayoutEffect

目录 1&#xff0c;介绍2&#xff0c;注意点 1&#xff0c;介绍 在用法上和 useEffect 没有任何区别&#xff0c;只是执行的时间点不同。 useEffect 会在组件渲染结束后&#xff0c;UI展示在页面上之后再执行。所以不会阻塞渲染。useLayoutEffect 会在组件渲染结束后&#xf…

课设--学生成绩管理系统(核心代码部分)

欢迎来到 Papicatch的博客 系统介绍 课设--学生成绩管理系统&#xff08;一&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;二&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;三&#xff09;-CSDN博客 目录 &#x1f349;内部接口 &#x1f348; 登…

awtk界面实现下拉屏功能

单页面下拉屏 1.src/common/下创建slidescreen.h slidescreen.c slidescreen.h #ifndef SLIDESCREEN_H #define SLIDESCREEN_H#include "awtk.h" #include "../common/navigator.h"BEGIN_C_DECLS#define false 0 #define true 1//滑屏动作值 #define SL…