springboot整合flowable

news2024/9/24 11:30:33

自动部署

流程图提前画好,放入 指定文件夹
配置:

spring.datasource.username=root
spring.datasource.password=root
# nullCatalogMeansCurrent=true  自动生成表
spring.datasource.url=jdbc:mysql:///flowable_process?serverTimezone=UTC&nullCatalogMeansCurrent=true&characterEncoding=utf-8



logging.level.org.flowable=debug


# 是否在项目启动的时候,自动去检查流程定义目录下,是否有对应的流程定义文件,,如果为false,则不会自动部署
flowable.check-process-definitions=true
# 默认的部署位置
flowable.process-definition-location-prefix=classpath*:/processes/

# 默认文件后缀  "**.bpmn20.xml", "**.bpmn"
flowable.process-definition-location-suffixes=**.bpmn20.xml,**.bpmn

手动部署

项目启动成功之后,再去部署流程

@RestController
public class ProcessDeployController {

    // 操作流程存储表  act_re_xxx
    @Autowired
    RepositoryService repositoryService;

    // procdef#category : 流程的分类,,xml中的 targetNameSpace
    @PostMapping("/deploy")
    public RespBean deploy(MultipartFile file) throws IOException {
        // act_re_deployment
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
                .name("deployment的name字段")
                .category("实例的分类,deployment的category")
                .key("deployment的key字段")
//                .addString()
                // 变成 ByteOutputStream#toByteArray
//                .addBytes()
                // 设置文件的输入流,通过这个输入流,自动读取文件
                // 资源名称不能随便取值,建议最好和文件名保持一致  ,,不然act_re_procdef 不添加数据
                .addInputStream(file.getOriginalFilename(), file.getInputStream());

//        System.out.println("file.getOriginalFilename() = " + file.getOriginalFilename());
//        System.out.println("file.getName() = " + file.getName());
        // 完成部署
        Deployment deploy = deploymentBuilder.deploy();
        return RespBean.ok("部署成功",deploy.getId());
    }

}

flowable API

RepositoryServcie

act_re_procdef

 void test01() {
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
//        for (ProcessDefinition processDefinition : list) {
//
//        }

        // 查看最新版本
        List<ProcessDefinition> list1 = repositoryService.createProcessDefinitionQuery().latestVersion().list();
        for (ProcessDefinition processDefinition : list1) {
            System.out.println("processDefinition.getId() = " + processDefinition.getId());
        }

        List<ProcessDefinition> list2 = repositoryService.createProcessDefinitionQuery().processDefinitionKey("").desc().list();


        List<ProcessDefinition> list3 = repositoryService.createNativeProcessDefinitionQuery().sql("").parameter("", "").list();


    }

act_re_deployment表:

    public void test02(){
        List<Deployment> list = repositoryService.createDeploymentQuery().list();
//        repositoryService.createDeploymentQuery().deploymentCategory("")

        // 根据 流程部署的id  查找流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("").singleResult();


        List<Deployment> list1 = repositoryService.createNativeDeploymentQuery().sql("").parameter("", "").list();

    
// 删除 。。涉及到流程定义的表,都会被删除
            repositoryService.deleteDeployment(deployment.getId());

    }


RuntimeService

流程执行 act_run_xxx

流程启动:

   // 流程运行时数据表
    @Autowired
    RuntimeService runtimeService;


    // 当一个流程执行完后,流程的数据 act_ru_xxx  将会被清空,,你只能从历史表中查询以前的数据
    @Test
    void test() {
        // 设置流程发起人
        Authentication.setAuthenticatedUserId("ww");

        // processDefinitionKey : 数据库中的 key字段,,xml文件的 流程id
        // 启动一个流程,获取流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");

        // 流程定义的id 需要自己查询,,,
//        runtimeService.startProcessInstanceById("")

        System.out.println(processInstance.getId()+"---"+processInstance.getName());
        
    }
 public void test06(){
        // 设置流程发起人
        identityService.setAuthenticatedUserId("zl");

        // 流程定义可以修改,发布很多个版本,,根据key查找会有很多个,,, 要查找 latestVersion()
        ProcessDefinition leave = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave").latestVersion().singleResult();

        ProcessInstance processInstance = runtimeService.startProcessInstanceById(leave.getId());
        System.out.println(processInstance.getId()+"--"+processInstance.getStartUserId());
    }

TaskService

act_ru_task : 需要用户处理的数据
查询某个人要参与的任务:

 public void test03(){
        // 查询某个人 需要处理的任务
        List<Task> list = taskService.createTaskQuery().taskAssignee("ww").list();
        for (Task task : list) {
            System.out.println(task.getId()+"---"+task.getName());

            // 完成任务  ,, act_ru_task 先添加新的任务,然后删除完成的任务,
            taskService.complete(task.getId());
        }
        
    }

act_ru_task 先添加新的任务,然后删除完成的任务,

act_ru_actinst : 流程活动的执行情况,,新增下一个执行实例的任务

流程执行完成后 act_ru_xxx表中记录全部清空

查看流程是否结束:

   @Test
    public void test04(){
          // act_ru_xxx  是否空了  act_ru_execution 的 PROC_INST_ID_
        // ACT_RU_EXECUTION    ACT_RE_PROCDEF
        String processId = "4f452a00-96f5-11ed-bebc-f0b61e94ce8e";
        // 流程实例只有一个 ,,, ACT_RU_EXECUTION存的是执行实例
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
        System.out.println("processInstance = " + processInstance);
    }

查看流程走到哪一步

   @Test
    public void test05(){
        // 查看当前流程走到哪一步了
        List<Execution> list = runtimeService.createExecutionQuery().list();
        for (Execution execution : list) {
            // 查询一个执行实例的  活动节点
            List<String> activeActivityIds = runtimeService.getActiveActivityIds(execution.getId());
            // act_ru_execution 的 act_id_
            System.out.println("activeActivityIds = " + activeActivityIds);
        }
    }

删除流程实例

  @Test
    public void test07(){
        runtimeService.deleteProcessInstance("4f452a00-96f5-11ed-bebc-f0b61e94ce8e","delete reason");
    }

流程定义挂起

   @Test
    public void test08(){
        // 查询流程定义
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();

        for (ProcessDefinition processDefinition : list) {
            // 挂起的流程定义 是无法开启流程实例的,,,    判断流程定义是否挂起
            boolean processDefinitionSuspended = repositoryService.isProcessDefinitionSuspended(processDefinition.getId());
            // 挂起一个 流程定义   修改 act_re_procdef 的 SUSPENSION_STATE_ 字段: 2:suspend   1:没有挂起
            repositoryService.suspendProcessDefinitionById(processDefinition.getId());

 			// 激活流程定义
            repositoryService.activateProcessDefinitionById(processDefinition.getId());
        }

    }

挂起的流程定义不能启动 流程实例

挂起流程实例
挂起的流程实例 不能 强制执行 task,,
修改 act_ru_execution,act_ru_taskact_re_procdef的 suspension_status_ 字段

   @Test
    public void test09(){

        // 对于一个挂起的流程实例,,我们是无法执行相应的 Task
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
        for (ProcessDefinition processDefinition : list) {
            // suspendProcessInstance : 是否挂起 这个流程定义对应的  流程实例,,,,   suspensionDate:挂起时间,到时间之后才会挂起,,null表示立即挂起,,
            // 流程实例被挂起,,,流程定义也被挂起
            // 涉及的表 : act_ru_execution   act_ru_task  act_re_procdef
            repositoryService.suspendProcessDefinitionById(processDefinition.getId(),true,null);

            // 激活  流程实例
            repositoryService.activateProcessDefinitionById(processDefinition.getId(),true,null);
        }

    }

DataObject
在这里插入图片描述

设置全局属性,最终是存储在act_ru_variable

    @Test
    public void test11(){
        // DataObject : 设置流程的一些全局属性,,,  整个流程的`数据对象`
        // <dataObject> 节点

        // 查询一个DataObject
        //  dataObject: act_ru_variable表的name字段
        DataObject dataObject = runtimeService.getDataObject("7e02f91d-9708-11ed-a857-f0b61e94ce8e", "绘制时间");
        System.out.println(dataObject.getName()+"-------"+dataObject.getValue());

        // 查询多个DataObject
        List<Execution> list = runtimeService.createExecutionQuery().list();
        for (Execution execution : list) {
            // key: DataObject的name ,,, value是DataObject
            Map<String, DataObject> dataObjects = runtimeService.getDataObjects(execution.getId());
            Set<String> keys = dataObjects.keySet();
            for (String key : keys) {
                System.out.println(key+"----"+dataObjects.get(key).getValue());
            }
        }
    }

租户 tenant

租户: tenant ,, 不同的子系统,,,部署相同的流程,,区分流程定义,属于哪个tenant
在这里插入图片描述
在这里插入图片描述act_re_procdef中 tenant_id_ 字段

如果设置了 tenant_id 在 启动流程实例的时候,必须携带 tenant_id

 Authentication.setAuthenticatedUserId("ww");
// 启动指定 tenantId
runtimeService.startProcessInstanceByKeyAndTenantId("leave","cc");

act_ru_task中有 tenant_id_字段,但是在执行task的时候不需要传入 tenantId,,
可以根据tanentId查找task

List<Task> list = taskService.createTaskQuery().taskTenantId("cc").list();

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

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

相关文章

CISP_VULHUB_HACK ME PLEASE

vulhub_HACK ME PLEASE简介扫描开放端口探测web服务搜集seedms的信息登录mysql&#xff0c;尝试获得seeddms的密码利用RCE漏洞提权简介 靶机链接&#xff1a;https://www.vulnhub.com/entry/hack-me-please-1,731/难度&#xff1a;简单描述&#xff1a;一个完全为OSCP设计的简…

数据结构之经典八大排序的实现(万字详谈)

文章目录前言1.插入排序2.希尔排序3.选择排序4.堆排序5.冒泡排序6.快速排序hoare方式版本快排实现非递归方式实现快排挖坑法实现快排前后指针法(双指针法&#xff09;快排的各种优化1.减少后几层的递归调用(小区间优化&#xff09;2.三数取中优化3.三路划分(处理大量重复数据&a…

信息论复习—信息的度量

目录 离散信源信息的度量&#xff1a; 离散信源的信息量&#xff1a; 单符号离散无记忆信源&#xff1a; 离散无记忆信源及熵&#xff1a; 自信息&#xff1a; 信息量的定义&#xff1a; 信息熵的定义&#xff1a; 熵的性质&#xff1a; 离散信源的最大熵定理&#xf…

Elasticsearch高级查询—— 关键字精确查询文档

目录一、初始化文档数据二、字段匹配查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age&…

LINUX学习之了解系统目录结构(一)

前言 Linux 系统目录结构是一个由各种目录和文件组成的树形结构&#xff0c;每个目录都有特定的用途。在这篇文章中&#xff0c;我们将讨论 Linux 系统中最常见的目录&#xff0c;并解释它们的用途 登录系统后输入ls命令查看系统目录 树状目录结构图 系统常用目录 目录名描述…

单目相机标定实现--张正友标定法

文章目录一&#xff1a;相机坐标系&#xff0c;像素平面坐标系&#xff0c;世界坐标系&#xff0c;归一化坐标系介绍1&#xff1a;概述公式二:实现1&#xff1a;整体流程4&#xff1a;求出每张图像的单应性矩阵并用LMA优化5&#xff1a;求解理想无畸变情况下的摄像机的内参数和…

SpringBoot项目集成liquibase,数据库版本控制解决方案

liquibase 数据库版本留痕解决方案&#xff0c;在实际生产过程中如何高效管理数据库的DDL与DML语句&#xff0c;对这些语句留痕处理。如果能将sql的执行与SpringBoot项目启动结合在一起&#xff0c;每次启动项目自动执行新增的sql语句&#xff0c;这样就可以使得项目组成员各个…

在 VMware Workstation 16 Pro 中安装 Ubuntu Server 22.04.1 并配置静态 IP 地址

文章目录1.下载 Ubuntu Server 22.04.12.新建虚拟机向导3.编辑虚拟机设置4.开启此虚拟机并配置Ubuntu系统5.设置 root 用户的密码6.允许远程连接 root 用户7.配置静态 IP 地址7.1 查看 Windows 的网络信息7.2 查看 Ubuntu 的网络信息7.3 修改配置文件7.4 测试 Windows 能否互相…

springcloud--xxl-job

xxl-job 虽然java自带定时器&#xff0c;但是在springcloud内&#xff0c;如果对多个模块进行统一任务调度&#xff0c;这是自带的定时器就显得不够用&#xff0c;这时就可以使用xxl-job。 xxl-job是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习…

智能门锁-手机应用相机国产、非国产统计参数对比分析

智能门锁-手机应用相机国产、非国产统计参数对比分析 智能门锁应用 从2019年1月1日至2020年12月31日&#xff0c;3D人脸识别智能门锁在全市场统计中&#xff0c;总销量已接近20万套。其中德施曼以其先发优势&#xff0c;良好的市场定位和大力度的推广&#xff0c;成为市场发展…

C语言萌新如何使用printf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳跃…

【Python标准库】LZ77编码的基本原理和lzma模块

文章目录lz77编码lzma模块调用lz77编码 Python标准库总共提供了三种压缩算法&#xff0c;分别是zlib, bz2以及lzma&#xff0c;并且位这三个模块提供了高度相似的API&#xff0c;考虑到zlib中已经对很多定义做了详尽的解读&#xff0c;本文主要介绍一下lzma算法&#xff0c;然…

vue使用rem, vscode使用px to rem工具

一、使用px2rem-loader实现pxtorem 1、安装 首先&#xff0c;我们使用 vue 的脚手架 vue-cli 初始化一个 webpack 项目&#xff08;前提是已经安装过 vue-cli&#xff0c;具体不再阐述&#xff09;&#xff0c;一些选项根据自己项目需要选择。 vue init webpack my-app命令执…

深度学习算法数据-网络-算法总结

深度学习算法数据-网络-算法总结 1 数据集大全 通用2D检测数据集、交通标志、车道线、行人检测、3D目标检测、ReID等数据集 2 Backbone知识汇总 该部分主要是针对常见CNN结构以及ViT结构进行汇总&#xff0c;同时也包含轻量化CNN Backbone以及轻量化Transformer模型等高性…

详解pandas的read_excel函数

一、官网参数 pandas官网参数网址&#xff1a;pandas.read_excel — pandas 1.5.2 documentation 如下所示&#xff1a; 二、常用参数详解 1、io 一般指读取文件的路径。【必须指定】 import pandas as pddf pd.read_excel(r"C:\Users\wwb\Desktop\data3.xlsx")p…

chromecast激活

小白误入旁路由添加dns解析&#xff08;1&#xff09;外部网络设置不动&#xff0c;内部网络设置第一个dns服务器指向旁路由自己&#xff0c;第二个dns服务器用常用的保证能用就行&#xff08;2&#xff09;添加dns解析&#xff0c;把安卓ntp&#xff0c;更新时间的服务器链接成…

一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码

文章较长,大家可选择性阅读,嘎嘎细 计算机结构 CPU的运行原理 CPU的控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。由运算器执行对应的机器指令,并将结果通过地…

如何用C++扩展NodeJS的能力?

文章目录前言C结合NodeJS的魅力C和NodeJS怎么结合通过Addon增强NodeJS环境的准备1. node-gyp2. nan (Native abstraction for NodeJS)编写Addon的C代码JS方法的C表示JS方法的传入参数 v8::Argument进阶进阶1: 输出一个JS包装类型进阶2: 使用多线程异步计算最后前言 Javascript…

Qt使用第三方库QXlsx将数据库的数据导出为Excel表格

一、参考和下载第三方库QXlsx 参考1 这篇博客对第三方库QXlsx介绍的比较详细。 1、概述 QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件&#xff0c;可以在Qt5支持的任何平台上使用。 2、使用方式 (1) QXlsx可以编译为静态库库使用&#xff08;可以提升项目编…

第03讲:使用kubeadm搭建k8s单master集群方案

一、安装前的准备工作 本实验使用1个master节点和2个node节点。 硬件配置&#xff08;必要&#xff09;&#xff1a;2GB 或更多 RAM&#xff0c;2 个 CPU 或更多 CPU&#xff0c;硬盘 30GB 或更多 开始本实验之前请先按照 使用kubeadm搭建k8s集群的准备工作 进行实验前的准备工…