Springboot整合Flowable流程引擎

news2024/11/29 8:48:53

文章目录

  • 前言
  • 1. Flowable的主要表结构
    • 1.1 通用数据表(通用表)
    • 1.2运行时数据表(runtime表)
    • 1.3.历史数据表(history表)
    • 1.4. 身份数据表(identity表)
    • 1.5. 流程定义数据表(repository表)
  • 2.springboot整合flowable
    • 2.1 流程定义
    • 2.2 引入依赖
    • 2.3 启动类
    • 2.4 启动服务
      • 2.4.1 启动错误,数据库驱动版本问题
      • 2.4.2 启动报错
    • 2.4 下载BPMN插件
    • 2.5 部署流程
    • 2.6 启动流程
    • 2.7 完成流程

前言

Flowable是一个开源的工作流引擎,它基于Activiti引擎进行发展,Flowable主要用于为业务流程管理(BPM)和工作流的设计、操作、监控提供支持。

1. Flowable的主要表结构

1.1 通用数据表(通用表)

这类表在Flowable中主要提供存储通用类型数据的功能,如流程名称,创建时间等。如下是通用表的主要成员:

  • act_ge_bytearray:存储二进制数据,如流程定义文件,流程图等。
  • act_ge_property:存储系统全局属性,如数据库版本信息等。

1.2运行时数据表(runtime表)

这类表主要用于在流程运行过程中,存储实时的流程数据。如下是运行时数据表的主要成员:

  • act_ru_event_subscr:存储运行时事件订阅数据,如boundary事件等。
  • act_ru_execution:存储运行时流程实例,包括当前状态,子流程引用等。
  • act_ru_identitylink:存储运行时任务的参与者(用户与组)的关联关系。
  • act_ru_job:存储工作任务的相关数据,如执行时间,重试次数等。
  • act_ru_task:存储运行时任务数据,如所属流程实例,任务名称等。
  • act_ru_variable:存储运行时的流程变量数据。

1.3.历史数据表(history表)

这类表主要用于在流程完成后,存储历史的流程数据,如流程实例,任务,变量等。如下是历史数据表的主要成员:

  • act_hi_attachment:存储附件相关历史数据。
  • act_hi_comment:存储评论相关历史数据。
  • act_hi_detail:存储流程变量修改相关历史数据。
  • act_hi_identitylink:存储任务参与者相关历史数据。
  • act_hi_procinst:存储流程实例相关历史数据。
  • act_hi_actinst:存储活动节点相关历史数据。
  • act_hi_taskinst:存储任务实例相关历史数据。
  • act_hi_varinst:存储流程变量相关历史数据。

1.4. 身份数据表(identity表)

这类表主要用于存储组织机构和用户权限相关的数据。如下是身份数据表的主要成员:

  • act_id_group:存储用户组相关数据。
  • act_id_membership:存储用户与用户组的关联关系。
  • act_id_user:存储用户相关数据。

1.5. 流程定义数据表(repository表)

这类表主要用于存储流程定义相关的数据。如下是流程定义数据表的主要成员:

  • act_re_deployment:存储流程部署相关数据。
  • act_re_model:存储流程设计模型相关数据。
  • act_re_procdef:存储流程定义相关数据。

2.springboot整合flowable

2.1 流程定义

  • . 流程定义(Process Definition):流程定义是包含所有流程与审批步骤(任务节点、网关等)的XML文件,通常使用BPMN(Business Process Model and Notation) 2.0语言编写。这些文件在部署到Flowable引擎时会存储到数据库中,以便在运行时创建实例。

  • 数据库表:Flowable使用关系型数据库来存储审批流相关的信息。其中的相关表格如下:

    • ACT_RE_PROCDEF: 存储流程定义信息
    • ACT_RE_DEPLOYMENT: 存储部署信息
    • ACT_RU_TASK: 存储运行时任务信息
    • ACT_RU_EXECUTION: 存储运行时流程实例
    • ACT_HI_PROCINST: 存储历史流程实例
    • ACT_HI_ACTINST: 存储历史活动实例
    • ACT_HI_TASKINST: 存储历史任务实例
    • ACT_HI_DETAIL: 存储历史明细数据
    • ACT_HI_COMMENT: 存储审批评论数据

2.2 引入依赖


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <flowable.version>6.7.2</flowable.version>
  </properties>
  <dependency>
     <groupId>org.flowable</groupId>
     <artifactId>flowable-spring-boot-starter</artifactId>
     <version>${flowable.version}</version>
   </dependency>
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
     <!--flowable引擎自动配置-->
    <dependency>
      <groupId>org.flowable</groupId>
      <artifactId>flowable-spring-boot-starter</artifactId>
      <version>${flowable.version}</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.22</version>
    </dependency>

2.3 启动类

/**
 * 启动类
 *
 */
@SpringBootApplication
public class FlowableApplication
{
    public static void main( String[] args )
    {
        System.out.println("流程系统启动.................");
        SpringApplication.run(FlowableApplication.class,args);
        System.out.println("流程系统启动成功.................");
    }
}

2.4 启动服务

启动服务会在数据库自动创建flowable的表,可能会出现下边的错误。

2.4.1 启动错误,数据库驱动版本问题

nested exception is org.flowable.common.engine.api.FlowableException: Could not update Flowable database schema: unknown version from database: ‘6.8.0.0’
解决方法:
修改mysql驱动的版本为8.0.22

2.4.2 启动报错

Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.22.jar:8.0.22]

项目mysql的版本5.6.51
导致上面报错的原因是由于InnoDB表的索引长度限制,在MySQL5.6版本后引入了参数innodb_large_prefix可以解决这个问题。该参数控制是否允许单列的索引长度超过767字节,有ON和OFF两个取值:
ON :Innodb表的行记录格式是Dynamic或Compressed的前提下,单列索引长度上限扩展到3072个字节
OFF:Innodb表的单例索引长度最多为767个字节,索引长度超出后,主键索引会创建失败,辅助索引会被截断成为前缀索引。
进行如下设置,重启mysql:

set global innodb_large_prefix = ON;
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;

2.4 下载BPMN插件

Visualizer
新建流程
BPMN

提交代码审批流程

文件的后缀名字 demo.bpmn20.xml

demo.bpmn20.xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
  <process id="DemoProcess" name="DemoProcess">
    <startEvent id="start"/>
    <sequenceFlow id="flow1" sourceRef="start" targetRef="userTask"/>
    <userTask id="userTask" name="User Task" flowable:assignee="${creator}"/>
    <sequenceFlow id="flow2" sourceRef="userTask" targetRef="end"/>
    <endEvent id="end"/>
  </process>
</definitions>

2.5 部署流程

/**
 * 流程部署
 */
@Component
public class ProcessDeployer {
    @Autowired
    private RepositoryService repositoryService;

    @PostConstruct
    public void init() {
        repositoryService.createDeployment()
                .addClasspathResource("demo.bpmn20.xml")
                .deploy();
    }
}

启动完成之后数据库表存储流程定义:=>ACT_RE_PROCDEF
在这里插入图片描述
存储部署表
在这里插入图片描述

2.6 启动流程

    //查询指定流程所有启动的实例列表
    @Autowired
    private RuntimeService runtimeService;
  /**
     * 启动
     * @param creator
     */
    public void startProcess(String creator) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("creator", creator);
        runtimeService.startProcessInstanceByKey("demoProcess", variables);
    }

2.7 完成流程

根据用户获取用户任务以及审批流

    @Autowired
    TaskService taskService;

    //获取用户ID获取的任务列表
    public List<Task> getTasksAssignedToUser(String userId) {

        TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(userId);
        return taskQuery.list();
    }
    //用户处理流程列表
    public void completeTask(String taskId, boolean approved) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task != null) {
            Map<String, Object> variables = new HashMap<>();
            variables.put("approved", approved);
            taskService.complete(taskId, variables);
        }
    }

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

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

相关文章

C++: 并行加速图像读取和处理的过程

文章目录 1. 目的2. 设计3. 串行实现4. 并行实现5. 比对&#xff1a;耗时和正确性6. 加速比探讨 1. 目的 读取单张图像&#xff0c;计算整图均值&#xff0c;这很好实现&#xff0c;运行耗时很短。 读取4000张相同大小的图像&#xff0c;分别计算均值&#xff0c;这也很好实现…

【OpenCv • c++】形态学技术操作 —— 开运算与闭运算

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

openGauss5.0.0在vscode成功调试

之前在虚拟机上编译成功过&#xff0c;但今天启动数据库的时候出现权限错误问题&#xff0c;我重新删除了data文件夹&#xff0c;重新初始化启动数据库还是不成功&#xff0c;后来对报错文件进行赋权&#xff0c;成功解决&#xff01; 问题&#xff08;一&#xff09; 1.启动…

图像水印MATLAB实验

文章目录 一、实验目的二、实验内容1. 简单的可见水印嵌入实验2. 不可见脆弱水印实验3. 不可见鲁棒水印实验 一、实验目的 了解数字图像水印技术的基本原理、分类和应用。掌握简单的可见水印和不可见水印的嵌入方法。实现一种基于DCT的不可见鲁棒水印&#xff0c;并进行水印鲁…

Dubbo 服务端源码深入分析 (7)

目录 1. 前提 2. 认识 Protocol 和 ProxyFactory Protocal ProxyFactory Dubbo服务流程 服务端源码分析 测试代码&#xff1a; Protocal代理的源码 ProxyFactory源码&#xff1a; 获取invoker对象 具体步骤 1. 我们调用的是ProxyFactory的代理对象的getInvoker方法…

Linux线程同步(6)——更高并行性的读写锁

互斥锁或自旋锁要么是加锁状态、要么是不加锁状态&#xff0c;而且一次只有一个线程可以对其加锁。读写锁有 3 种状态&#xff1a;读模式下的加锁状态&#xff08;以下简称读加锁状态&#xff09;、写模式下的加锁状态&#xff08;以下简称写加锁状态&#xff09;和不加锁状态&…

django视图(request请求response返回值)

一、视图函数介绍 视图就是应用中views.py中定义的函数&#xff0c;称为视图函数 def index(request):return HttpResponse("hello world&#xff01;") 1、视图的第一个参数必须为HttpRequest对象&#xff0c;还可能包含下参数如通过正则表达式组获取的位置参数、通…

VBA——01篇(入门篇——简单基础语法)

VBA——01篇&#xff08;入门篇——简单基础语法&#xff09; 1. 语法格式1.1 简单语法1.2 简单例子 2. 变量2.1 常用数据类型2.2 声明变量的常用方式2.3 简单例子 3. 单元格赋值3.1 直接赋值3.2 拷贝单元格 4. 简单的逻辑语法4.1 简单if4.2 简单for循环4.2.1 简单语法例子4.2.…

基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)

参考资料&#xff1a;主动配电网网络分析与运行调控 (sciencereading.cn) 配电网重构是指在满足配电网运行基本约束的前提下&#xff0c;通过改变配电网中一个或多个开关的状态对配电网中一个或多个指标进行优化。通过配电网重构&#xff0c;可以在不增加设备投资的情况下&…

注解实现:判空赋值

工作中的小玩意~~ 流程&#xff1a; 注解实现反射工具类 注解定义及实现 注解定义&#xff1a; Documented Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface CheckParam {String value() default "-1"; }简单解释上述其相关注解…

哈工大2023春计算机组成原理真题回忆

仅供同学参考&#xff0c;严禁用作商业用途 如发现将追究责任 2023-5-14 属鼠经历了计算机组成原理考试 现将本人真题回忆如下&#xff1a;欢迎大家补充&#xff0c;并期待大家一起参与这个开源的项目。 致谢:真诚感谢草履虫同学提供的图片 15个选择部分回忆如下 &#xff1a…

【历史上的今天】4 月 13 日:Damn Small Linux 首次发布;谷歌关闭短网址服务;数学先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 13 日&#xff0c;在 2006 年的今天&#xff0c;盛大文学榕树下网站被民营企业收购&#xff1b;原创文学网站榕树下被民营传媒集团欢乐传媒收购&#xff…

hnust 湖南科技大学 2023 软件测试技术 期中考试 复习资料

前言 写的比较匆忙&#xff0c;重点也不明确&#xff0c;没什么参考价值致谢&#xff1a;ly&#xff0c;zxq重点来源&#xff1a;信安※&#xff1a;补充内容★&#xff1a;重点✦&#xff1a;个人推测考点考试范围&#xff1a;1-9章获取最新版本 题型 判断&#xff1a;10简…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子&#xff0c;跑Amber动力学模拟 下载1phv 从PBD下载文件&#xff1a;https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

系统设计基本原理-耦合与内聚

耦合 耦合是模块之间的相互独立性(互相连接的紧密程度)的度量&#xff0c;耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。 耦合类型 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&…

k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

文章目录 一、K8s安全框架1.1 鉴权1.1.1 HTTPS证书认证1.1.2 HTTP Token认证 1.2 授权1.3 准入控制1.4 集群四大角色 二、RBAC给用户授权&#xff08;TLS&#xff09;2.1 签发客户端证书2.2 生成kubeconfig授权文件2.2.1 手动生成2.2.2 脚本生成2.2.3 切换操作集群 2.3 定义RBA…

移动应用开发实验-内容提供者-ContentResolver的使用

文章目录 前言读取通讯录信息要求环境 具体实现主页面布局(activity_main.xml)关于RecyclerView库的相关问题添加RecyclerView库操作 解决报错Item布局(info.xml)添加访问权限编写实体类&#xff08;ContactInfo.java&#xff09;编写适配器&#xff08;MyAdapter.java&#xf…

20 散列表的查找

散列表的查找 简介&#xff1a;散列表&#xff08;也成哈希表&#xff09;是一种高效的数据结构&#xff0c;他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

计算机视觉——day 91基于双网络的鲁棒特征高光谱目标检测(偏门且很水啊)

基于双网络的鲁棒特征高光谱目标检测 I. INTRODUCTIONII. 提出的方法A. 总体框架B.训练集构建C. Dual Networks III. EXPERIMENTSIV. 结论 I. INTRODUCTION 用于高光谱目标检测的深度网络训练通常面临样本有限的问题&#xff0c;在极端情况下&#xff0c;可能只有一个目标样本…

黑盒测试方法

1 等价类划分 1.1 定义 等价类划分法是一种典型的&#xff0c;并且是最基础的黑盒测试用例设计方法。采用等价类划分法时&#xff0c;完全不用考虑程序内部结构&#xff0c;设计测试用例的唯一依据是软件需求规格说明书。 所谓等价类&#xff0c;是输入条件的一个子集合&…