在Springboot集成Activiti工作流引擎-引入、调用,测试【基础讲解】

工作流 通过计算机对业务流程自动化执行管理
他主要解决的是使在多个参与者之间按照某种“预定义规则”自动进行传递稳定 信息或任务的过程
通俗来讲 业务上一个玩着的审批流程 比如请假,出差 外出采购等

工作流引擎就是来解决流程问题的 提高我们的工作效率

如果没有工作流引擎 我们就需要自己去写逻辑 就特别的复杂 扩展性还不强

使用工作流引擎 业务改变,不需要修改代码
如果是我们自己写的逻辑 有可能 业务改变,代码也需要改变

那么为什么工作流引擎不用修改代码
因为我们的工作流引擎都实现了一个规范
这个规范要求我们的流程管理与状态字段无关,始终都是读取业务流程图的下一个节点
当业务发生改变我们只需要更新业务流程图即可

常见的工作流引擎有
Activiti、jBPM、Camunda、Flowable 还有我们国产的盘古BPM、云程

https://www.activiti.org/ 官网地址

建模语言BPMN
BPM 意思就是 业务流程管理,
BPM 软件根据企业中业务环节的变化,推进人与人之间,人与系统之间以及系统与系统之间的整理及调整的经营方法和解决方案的IT工具

BPMN 意思就是 业务流程模型和符号,是一套标准的业务流程建模符号 Activiti就是使用BPMN 进行流程建模和流程执行管理

事件 Event

开始 表示一个流程的开始
中间 发生的开始和结束事件之间,影响处理流程
结束 表示该过程结束
在这里插入图片描述

活动 Activities

活动是工作或任务的一个通用术语,一个活动也可以是一个任务还是可以是一个当前流程的子处理流程
其次 你还可以为活动指定不同的类型
比如
用户任务-> 服务任务-> 子流程
在这里插入图片描述

网关 GateWay

用于表示流程的分支与合并
排他网关 并行网关 包容网关 综合网关 事件网关

在这里插入图片描述

排他网关 只有一条路径会被选择
并行网关 所有路径都会被同时选择
包容网关 可以同时执行多条线路,也可以在网关上设置条件
事件网关 专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件
当流程执行到事件网关后,流程处于等待状态,需要等抛出事件才能将等待状态转换为活动状态

在这里插入图片描述

流向 Flow
流是连接两个流程节点的连线
顺序流:用一个带实心箭头的实心线表示,用于指定活动执行顺序
信息流:用一条带箭头的虚线表示,用于描述两个独立的业务参与者之间发送和接受的消息流动
关联: 用一根带有线箭头的点线表示,用于将相关的数据,文本,和其他人工信息与流对象联系起来
用于展示活动的输入和输出

在这里插入图片描述

Activiti的使用流程

第一步 引入依赖并初始化数据库
引入依赖

第二步 通过工具绘画流程图
通过Activiti流程建模工具定义业务流程 生成(.bpmn文件)
.bpmn文件就是业务流程定义文件 通过xml定义业务流程

第三步 流程定义部署
向Activiti部署业务流程定义(.bpmn文件) 使用Activiti提供的api向Activiti中部署.bpmn文件
通俗一点就是 让Activiti认识要使用的流程

第四步 启动一个流程实例
启动一个流程实例表示开始一次业务流程的运行

第五步 用户查询代办任务
因为现在流程的业务交给了Activiti管理 通过Activiti就可以查询当前流程执行到那里了
当前用户需要执行什么任务 这些Activiti都会帮我们管理
我们学习了Activiti的API 就可以了

第六步 用户办理任务
用户查询代办任务后,就可以办理某个任务,如果这个任务办理还需要其他用户办理,也不需要我们写代码
Activiti 帮我们完成了

第七步 流程结束

Activiti 数据库支持 mysql 等

项目使用

第一步 引入依赖

    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring-boot-starter</artifactId>
        <version>7.1.0.M6</version>
        <exclusions>
            <exclusion>
                <artifactId>mybatis</artifactId>
                <groupId>org.mybatis</groupId>
            </exclusion>
        </exclusions>
    </dependency>

activiti 默认集成了Security 安全框架,当前我们项目里已经集成了Security 后续设置审批人必须是系统用户
否则会报错

第二步 添加配置

spring
   activiti:
     #    false:默认,数据库表不变,但是如果版本不对或者缺失表会抛出异常(生产使用)
     #    true:表不存在,自动创建(开发使用)
     #    create_drop: 启动时创建,关闭时删除表(测试使用)
     #    drop_create: 启动时删除表,在创建表 (不需要手动关闭引擎)
     database-schema-update: true
     #监测历史表是否存在,activities7默认不开启历史表
     db-history-used: true
     #none:不保存任何历史数据,流程中这是最高效的
     #activity:只保存流程实例和流程行为
     #audit:除了activity,还保存全部的流程任务以及其属性,audit为history默认值
     #full:除了audit、还保存其他全部流程相关的细节数据,包括一些流程参数
     history-level: full
     #校验流程文件,默认校验resources下的process 文件夹的流程文件
     check-process-definitions: true

第三步:启动项目后 如果表不存在 会自动创建

表介绍
act_re re表示repository 这个前缀包含了定义和流程静态资源
act_ru ru表示runtime 表示表运行时
act_hi hi表示history 历史数据
act_ge ge表示general 通用数据
在这里插入图片描述
在这里插入图片描述

第四步 activiti 设计工具

官网下载地址
https://www.activiti.org/#get-started
官方提供的一个工具
Activiti Modeler
这个工具是 war包 测试的话 自行去搭建 tomcat

地址 localhost:8080/activiti-explorer
默认用户名 密码
kermit kermit

在这个系统里 生成流程后 然后 导出 xml和 流程图片

然后把这两个资源 导入到resources 里
导入也可以用压缩包方式导入
这些操作 就不写了

然后测试

1. 流程定义部署

    @Test
    public void deployProcess(){
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("process/qingjia.bpmn20.xml")
                .addClasspathResource("process/qingjia.png")
                .name("请假流程")
                .deploy();
        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
    }

2. 启动一个流程实例

  //启动实例
    @Test
    public void startProcess(){
        ProcessInstance qingjia = runtimeService.startProcessInstanceByKey("qingjia");
        System.out.println("流程定义ID"+qingjia.getProcessDefinitionId());
        System.out.println("流程实例ID"+qingjia.getId());
        System.out.println("流程活动ID"+qingjia.getActivityId());
    }

3. 用户查询代办任务

    //查询个人代办任务 -- zhangsan
    @Test
    public void findTaskList(){
        String name="zhangsan";
        List<Task> taskList = taskService.createTaskQuery()
                .taskAssignee(name)
                .list();
        taskList.forEach(item->{
            System.out.println("流程实例的ID"+item.getProcessInstanceId());
            System.out.println("任务id"+item.getId());
            System.out.println("任务负责人"+item.getAssignee());
            System.out.println("任务名称"+item.getName());
        });

    }

4. 用户办理任务 (处理任务)

    @Test
    public void completTask(){
        String name="zhangsan";
        //查询负责人需要处理的任务 返回一条
        Task task = taskService.createTaskQuery().taskAssignee(name).singleResult();
        //处理任务 参数就是id
        taskService.complete(task.getId());
        //完成后会自动到下一个节点

    }

5. 查询已经处理的任务

   @Test
    public void findcompleteTaskList(){
        String name="zhangsan";
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                .taskAssignee(name)
                .finished().list();
        list.forEach(item->{
            System.out.println("流程实例的ID"+item.getProcessInstanceId());
            System.out.println("任务id"+item.getId());
            System.out.println("任务负责人"+item.getAssignee());
            System.out.println("任务名称"+item.getName());
        });

    }

====================================

什么叫流程实例
流程定义 ProcessDefinition和流程实例ProcessInstance是 activiti重要概念
类似于java类和java实例的关系
启动一个流程实例就是启动一个业务流程的运行
一个业务流程就要启动一个实例

让实际业务和activiti表关联(BusinessKey)
比如我们填写了一个请假单 一定会有一个请假单的唯一标识
通常会使用这个标识来关联activiti 这个标识在activiti中成为BusinessKey

BusinessKey:业务标识,通常为业务主键,业务标识和流程标识一一对应
业务标识来源于业务系统,存储业务标识就是根据业务标识来关联查询业务系统数据

举例 请假启动一个流程实例,将请假单的id作为业务标识存储到activiti中
将来查询activiti的流程实例信息就可以获取请假单的id从而关联查询业务系统里的请节单数据

测试:

 //启动实例 添加BusinessKey
    @Test
    public void startProcessBusinessKey(){
    //startProcessInstanceByKey 参数二
        ProcessInstance qingjia = runtimeService.startProcessInstanceByKey("qingjia","1001");
        System.out.println("流程定义ID"+qingjia.getProcessDefinitionId());
        System.out.println("流程实例ID"+qingjia.getId());
        System.out.println("流程活动ID"+qingjia.getActivityId());
        System.out.println("BusinessKey-业务id"+qingjia.getBusinessKey());
    }

==================================================================

挂起,激活流程实例

应用场景
比如 公司每个月的最后一天 需要封账,这个时候申请的报销审批 就可以挂起

  1. 全部流程实例挂起
    @Test
    public void suspendProcessInstance(){
           //1.获取流程定义对象
        ProcessDefinition qingjia = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("qingjia")
                .singleResult();
        //2. 调用流程定义对象的方法判断当前状态:挂起 还是激活
        boolean suspended = qingjia.isSuspended();
        //3. 判断挂起还是激活
        //如果 true 挂起状态 就要让他激活
        if(suspended){
            //那就执行激活
            //第一个参数 流程定义的id
            // 第二个参数 是否激活 true
            // 第三个参数 时间点
            repositoryService.activateProcessDefinitionById(qingjia.getId(),true,null);
            System.out.println("激活了");
        }else{
            repositoryService.suspendProcessDefinitionById(qingjia.getId(),true,null);
            System.out.println("挂起了");
        }
    }
  1. 单个的流程实例挂起
   @Test
    public void suspendProcessInstanceOne(){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId("流程实例ID")
                .singleResult();
        boolean suspended = processInstance.isSuspended();
        //如果 true 挂起状态 就要让他激活
        if(suspended){
            //那就执行激活
            //第一个参数 流程定义的id
            // 第二个参数 是否激活 true
            // 第三个参数 时间点
            runtimeService.activateProcessInstanceById("流程实例ID");
            System.out.println("激活了");
        }else{
            runtimeService.startProcessInstanceByKey("流程实例ID");
            System.out.println("挂起了");
        }

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源项目】低代码数据可视化开发平台-Datav

Datav 基本介绍 Datav是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 它的技术栈为&#xff1a;Vue3 TypeScript4 Vite2 ECharts5 Axios Pinia2 在线预览 账号: admin 密码: 123123预…

【VB6|第21期】检查SqlServer数据库置疑损坏的小工具(含源码)

日期&#xff1a;2023年7月25日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

《MySQL45讲》笔记—事务隔离

事务 事务就是保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 原子性 一个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成&#xff0c;不会结束在中间某个环节&#xff0c;而且事务在执行过程中发生错误&#xff0c;会被回滚…

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归分位数回归多输入单输出区间…

Docker 容器高级操作

Docker容器高级操作 Docker容器创建、停止、启动、删除等基础操作上篇已述,然Docker容器被广大开发者青睐,不可能只有如此简单的功能,必有高阶功法。那么接下来 让我们一同走进容器操作的高级篇,领略其高级操作的魅力。 查看容器 docker ps -a | grep tomcat [root@tudou…

qt6.5 download for kali/ubuntu ,windows (以及配置选项选择)

download and sign in qt官网 sign in onlion Install 1 2 3 4 5

Redis服务优化

目录 一.Rde高可用 二.Rdies持久化 2.1持久化的功能 2.2Redis 提供两种方式进行持久化 三.RDB持久化 3.1触发条件 3.1.1手动触发 3.1.2自动触发 3.1.3其他自动触发机制 3.1.4执行流程 3.1.5启动时加载 四.AOF持久化 4.1开启AOF 4.2执行流程 4.2.1命令追加(append) 4.2.2文件写…

【论文阅读22】Label prompt for multi-label text classification

论文相关 论文标题&#xff1a;Label prompt for multi-label text classification&#xff08;基于提示学习的多标签文本分类&#xff09; 发表时间&#xff1a;2023 领域&#xff1a;多标签文本分类 发表期刊&#xff1a;Applied Intelligence&#xff08;SCI二区&#xff0…

FPGA设计时序分析二、建立/恢复时间

目录 一、背景知识 1.1 理想时序模型 1.2 实际时序模型 1.2.1 时钟不确定性 1.2.2 触发器特性 二、时序分析 2.1 时序模型图 ​2.2 时序定性分析 一、背景知识 之前的章节提到&#xff0c;时钟对于FPGA的重要性不亚于心脏对于人的重要性&#xff0c;所有的逻辑运算都离开…

Python 进阶(一):PyCharm 下载、安装和使用

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、下载 PyCharm二、安装 PyCharm三、创建项目四、界面汉化五、实用技巧5.1、使用快捷…

EtherNet/IP转 Modbus网关实现AB PLC控制变频器案例

捷米特JM-EIP-RTU网关 Modbus转ETHERNET/IP用于将多个变频器连接到Ethernet/Ip主网&#xff0c;以便森兰变频器可以由AB PLC控制。 配备专用于JM-EIP-RTU网关的EDS文件&#xff0c;AB PLC主站可以控制森兰逆变器从站。 使用 AB 系统的配置方法 1&#xff0c; 运行 RSLogix 500…

OpenGl中的VAO、VBO与EBO

文章目录 VBO(顶点缓冲区对象)VBO的使用 EBO(索引缓冲对象)EBO的使用 VAO(顶点数组对象)VAO的使用 三者的区别someting。。。 哎&#xff0c;很离谱&#xff0c;上个月学learnopengl学到一半跑去看庄懂老师的视频&#xff0c;结果该还的东西迟早得还&#xff0c;再打开之前的工…

微信小程序使用ECharts的示例详解

目录 安装 ECharts 组件使用 ECharts 组件图表延迟加载 echarts-for-weixin 是 ECharts 官方维护的一个开源项目&#xff0c;提供了一个微信小程序组件&#xff08;Component&#xff09;&#xff0c;我们可以通过这个组件在微信小程序中使用 ECharts 绘制图表。 echarts-fo…

蓝桥杯专题-真题版含答案-【贪吃蛇长度】【油漆面积】【绘制圆】【高次方数的尾数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Ansible 自动化运维

目录 ansible 环境安装部署ansible 命令行模块inventory 主机清单 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可…

Wireshark抓包分析教程(ubuntu版本)

安装 first&#xff0c;多亏我们的C知道&#xff0c;成功安装了wireshark&#xff0c; Steps are as following&#xff1a; 添加wireshark的软件源(PPA:personal package archive(档案)) sudo apt-add-repository ppa:wireshark-dev/stable ppa:wireshark-dev/stable 是一个…

PHP数组转对象和对象转数组

PHP数组转对象和对象转数组 <?php function array_to_object($arr){$obj new stdClass();foreach ($arr as $key > $val) {if (is_array($val) || is_object($val)) {$obj->$key array_to_object($val);} else {$obj->$key $val;}}return $obj; } function o…

Kyuubi入门简介

一、官方简介 HOME — Apache Kyuubi 二、概述 1、一个企业级数据湖探索平台 2、一个高性能的通用JDBC和SQL执行引擎 3、一个基于spark的查询引擎服务 三、优点 1、提供hiveserver2查询spark sql的能力&#xff0c;查询效率更为高效&#xff0c;首次构建连接时会持续保持连…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

DDL\DML

查询字段 1、查询指定字段 select 字段1, 字段2 ,...] from 表名; select ename, sal from emp; select ename from emp; 2、查询全部字段 select * from 表名; select * from emp; 条件查询 使用 where 语句&#xff0c;放在 from 后 select * from emp where 条件…
最新文章