Activiti 学习(二)—— Activiti 流程定义和部署

2023-11-14


概述

在这一节,我们将创建一个 Activit 工作流,并启动这个流程,主要包含以下几个步骤:

  1. 定义流程,按照 BPMN 的规范,使用流程定义工具,用流程符号把整个流程描述出来

  2. 部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据


流程设计器的使用

在 resources 目录下创建一个 bpmn 目录,用来存放流程定义文件。选中 bpmn 目录,点击菜单 New -> New Activity 6.x BPMN 2.x file,创建一个 *.bpmn20.xml。选中该文件,右键 view BPMN(Activity ) Diagram,可以看到 BPMN-Activiti-Diagram 流程设计页面。在该页面右键,可以在菜单选择图形,拖拽图形,连线,即可完成流程设计图

在这里插入图片描述

连线的时候,要选中图形,这时在图形的右上角会出现一个箭头符号。双击选中箭头符号,右键按住不放即可拉长完成连线

在这里插入图片描述

选中一个图形,下方会出现一个属性栏,以创建出差申请为例,这里只填任务名称和负责人

在这里插入图片描述

流程部署

流程部署就是将在设计器中定义的流程部署到 activiti 数据库中,Activiti 提供了多种部署流程的方式,包括自动部署、classpath 部署、输入流部署、zip/bar 部署和上传部署等方式,下面分别进行介绍:

1. 自动部署

Activiti7 可以自动部署流程,前提是在 resources 目录下,创建一个新的目录 processes,用来放置 bpmn 文件

2. classpath 部署

classpath 部署方式为采用代码进行部署,使用 Java 代码实现如下:

public class ActivitDemo {

    @Test
    public void testDeployment() {
        // 1. 创建 ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 使用 service 进行流程部署,即把 bpmn 部署到数据库,并定义流程的名称
        Deployment deploy = repositoryService.createDeployment()
            	// 定义流程资源名称
                .name("出差申请流程")
            	// 加载待部署的资源,可以多次引用
                .addClasspathResource("bpmn/evection.bpmn20.xml")
            	// 完成部署
                .deploy();
    }
}
3. 输入流部署

Activiti 提供了按输入流(InputStream)方式部署资源,输入流的来源可以有多种,例如本地计算机、classpath 读取、网络读取方式等,下面是读取本地计算机方式进行部署方式的示例代码

public class ActivitDemo {

    @Test
    public void testDeployment() {
        // 1. 创建 ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 获取输入流
        String filePath = "D:/workflow/bpmn/evection.bpmn20.xml";
        FileInputStream fileIns = new FileInputStream(filePath);
        // 4. 使用 service 进行流程部署
        Deployment deploy = repositoryService.createDeployment()
                .name("出差申请流程")
                .addInputStream("bpmn/evection.bpmn20.xml", fileIns)
                .deploy();
    }
}
4. zip/bar 部署

将流程资源文件压缩成 zip 包进行部署,同样采用流的方式

public void deployProcessByZip() {
    // 1. 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 3. 流程部署
    InputStream inputStream = this.getClass()
        .getClassLoader()
        .getResourceAsStream("bpmn/evection.zip");
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    repositoryService.createDeployment()
        .addZipInputStream(zipInputStream)
        .deploy();
}
5. 按字符串方式部署

采用字符串方式进行部署,实际是把一个字符串转换为字节流后进行部署,也为开发人员提供了多一种部署方式

public void deployProcessByStr() {
    // 1. 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2. 获取 RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 3. 构建字符串
    String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>"
    // 4. 流程部署
    repositoryService.createDeployment()
        .name("出差申请流程")
        .addStr("bpmn/evection.bpmn20.xml", str)
        .deploy();
}

采用字符串进行部署的优点是可以通过用户界面定义一个流程,然后进行部署,或者在测试时,直接将流程代码写入程序,进行流程部署

6. 动态 BPMN 模型部署

通过在程序中动态生成流程模型方式进行部署,动态创建 BPMN,需要在程序中指定每一个元素,并给出元素间的关系,最后将这些元素整合为一个完整的 BPMN

public void testDeploymentByBPMN() {
    // 1. 创建 BPMN 模型实例
    BpmnModel bpmnModel = new BpmnModel();
    // 2. 创建开始事件
    StartEvent startEvent = new StartEvent();
    startEvent.setId("startEvent");
    startEvent.setName("动态创建开始节点");
    // 3. 创建用户任务
    UserTask userTask = new UserTask();
    userTask.setId("userTask1");
    userTask.setName("用户任务节点1");
    // 4. 创建结束事件
    EndEvent endEvent = new EndEvent();
    endEvent.setId("endEvent");
    endEvent.setName("动态创建结束节点");
    // 5. 定义连接
    ArrayList<SequenceFlow> sequenceFlows = new ArrayList<>();
    ArrayList<SequenceFlow> toEnd = new ArrayList<>();

    SequenceFlow s1 = new SequenceFlow();
    s1.setId("sequenceFlow1");
    s1.setName("开始节点指向用户任务节点");
    s1.setSourceRef("startEvent");
    s1.setTargetRef("userTask1");
    sequenceFlows.add(s1);
    SequenceFlow s2 = new SequenceFlow();
    s2.setId("sequenceFlow2");
    s2.setName("用户任务节点指向结束节点");
    s2.setSourceRef("userTask1");
    s2.setTargetRef("endEvent");
    toEnd.add(s2);

    startEvent.setOutgoingFlows(sequenceFlows);
    userTask.setOutgoingFlows(toEnd);
    userTask.setIncomingFlows(sequenceFlows);
    endEvent.setIncomingFlows(toEnd);

    Process process = new Process();
    process.setId("process1");
    process.setName("test");
    process.addFlowElement(startEvent);
    process.addFlowElement(s1);
    process.addFlowElement(userTask);
    process.addFlowElement(s2);
    process.addFlowElement(endEvent);
    bpmnModel.addProcess(process);
    new BpmnAutoLayout(bpmnModel).execute();
    // 6. 部署
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    Deployment deploy = repositoryService.createDeployment()
        .name("出差申请流程")
        .addBpmnModel("evection.bpmn20.xml", bpmnModel)
        .deploy();
}
7. 相关数据表分析

流程部署后,流程相关的资源全部以数据流的形式存储到数据表中,实际运行中,流程的处理都是通过调用数据表中的相关资源进行处理,下面介绍流程相关的数据表:

  • act_re_deployment

    流程部署表,用于存放流程定义的部署信息,部署一个流程就会增加一条记录

  • act_re_procdef

    流程定义表,用于存放流程定义的属性信息,和 act_re_deployment 是一对多的关系,act_re_procdef 表可以有多条记录,每条记录对应 act_re_deployment 中的一条记录

  • act_ge_bytearray

    资源文件表,部署流程时,会将 BPMN 流程定义文件保存为一条记录,如果部署的流程还包括其他资源,也会增加相应的记录,例如 png 图片文件


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Activiti 学习(二)—— Activiti 流程定义和部署 的相关文章

  • Nexus5596交换机支持3层需要的子卡

    3层子卡 nexus5596如果没有这块子卡 无法支持3层特性 TEST Cisco N5596 1 show modu Mod Ports Module Type Model Status 1 48 O2 32X10GBase T 16X
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • AntDB内存管理之内存上下文之如何使用内存上下文

    5 如何使用内存上下文 使用内存上下文之前 我们需要先对其进行创建 AntDB启动时已经创建并初始化好了部分内存上下文 例如 TopMemoryContext 这个TopMemoryContext是所有内存上下文的父节点或者祖先节点 一般我
  • 【计算机毕业设计】网上拍卖系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本网上拍卖系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管理人员
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • 图解python | 字符串及操作

    1 Python元组 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 tup1 ByteDance ShowMeAI 1997 202
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 30天精通Nodejs--第二十天:express-操作mysql

    目录 前言 安装依赖并配置MySQL连接 安装mysql2库 配置连接信息 在Express应用中使用MySQL 结合Express路由实现CRUD操作 整合到主应用 结语 前言 在Node js中使用Expre
  • MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

    目录 一 MongoDB 1 1 简介 a MongoDB 是什么 为什么要使用 MongoDB b 应用场景 c MongoDB 这么强大 是不是可以直接代替 MySQL d MongoDB 中的一些概念 e Docker 下载 1 2
  • SAP ERP系统是什么?SAP好用吗?

    A公司是一家传统制造企业 公司曾先后使用过数个管理软件系统 但各部门使用的软件都是单独功能 导致企业日常管理中数据流与信息流相对独立 形成了 信息孤岛 随着公司近年业务规模的快速发展以及客户数量的迅速增加 企业原有的信息系统在销售预测及生产
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具
  • 开源 BPM 工具(如 Activiti、bonita)和 Windows Workflow Foundation 之间有什么区别

    我试图找到一个基于asp net的免费开源BPM工具 但不幸的是我没有找到这样的工具 但最近我读到一篇关于Windows Workflow Foundation的文章 那么它是否提供了类似于开源BPM工具如Activiti bonita J

随机推荐

  • 关于排水管道沉积模拟建模的想法

    首先管道沉积是一个较为复杂的过程 对其分析主要考虑了无机盐所造成的影响 在立项书中 已经给出了各种元素的占比 据此可推理出对沉积起着主导作用的化学反应 在排水管中原本的污水 所以考虑的重点方向就是在特定温度 特定流速下 无机盐的沉积量随时间
  • Shell脚本中字符串截取功能

    在Shell脚本编写中 有几个地方都是要用到字符串截取的功能 那将这块的内容进行下记录 1 字符串变量的截取操作 对字符串变量的截取操作一般都是通过 操作符 的方式进行 1 从指定位置index截取固定长度 格式 string start
  • Oracle中的锁

    Oracle数据库支持多个用户同时与数据库进行交互 每个用户都可以同时运行自己的事务 从而也需要对并发访问进行控制 Oracle也是用 锁 的机制来防止各个事务之间的相互影响 对并发访问进行控制的 保证数据的一致性和完整性 当一个事务或操作
  • 【工具】python代码编辑器--PyCharm下载安装和介绍

    PyCharm是一种Python IDE 集成开发环境 由JetBrains打造 它带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具 比如调试 语法高亮 项目管理 代码跳转 智能提示 自动完成 单元测试 版本控制等 此外
  • 【华为OD】

    华为OD试题注意事项 使用合适的编程语言 在华为OD机试中多数情况下使用C 或Java 按照题目要求进行编码 仔细阅读题目描述并理解要求 在编码前可以进行伪代码编写或画流程图有助于理解和排除逻辑错误 注意代码的规范性 注重代码的可读性和可维
  • Python有趣小程序代码

    1 打印心形 print n join join Love x y 4 if x 0 05 2 y 0 1 2 1 3 x 0 05 2 y 0 1 3 lt 0 else for x in range 30 30 for y in ran
  • Socket传输文件/传输图片(Windows)

    利用UDP socket 来传输文件与图片 流程图如下 主要流程 1 client端发送command请求 上传数据或者下载数据 选择文件路径 2 server端应答 start代表开始传输 no代表拒绝 3 fopen打开文件进行读取 f
  • ubuntu20使用Systemback克隆系统

    一 使用的工具 SystemBack 克隆系统 cdrtools 3 02 将systemback生成文件转换为iso Ventoy iso文件写入u盘 作为安装盘 文末有相关工具下载链接 二 SystemBak克隆系统步骤 1 安装Sys
  • 关于html中,刷新页面后<input>输入框内容不会被刷新的问题

    只需要在
  • 构建测试的体系化思维(高级篇)

    本文首发于个人网站 BY林子 转载请参考版权声明 00 引言 1 三个层次聊测试体系 测试人员缺乏体系化思维 新建产品团队或者新启项目 如何系统化地测试 组织级如何构建统一的测试体系 大家都接触过不计其数的测试 质量方面的文章或者培训课程
  • C++ Template

    引言 模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 函数模板 在c 入门中 很多人会接触swap int i
  • android 手势检测(左右滑动、上下滑动)

    开发十年 就只剩下这套Java开发体系了 gt gt gt GestureDetector类可以让我们快速的处理手势事件 如点击 滑动等 使用GestureDetector分三步 1 定义GestureDetector类 2 初始化手势类
  • 共轭方式怎么判断_怎么判断共轭效应是吸电子共轭效应还是给电子共轭效应?吸电子基和给电子基是根据什么判断的?...

    谢邀 我想按照我的思路给你解答解答 我要祭出我的高等有机化学笔记了 先说一句 要笔记的 在老家放着 没法卖给你们 而且说实话不好好看书的人 给你笔记你也不会 共轭效应只是众多电子效应中的一种 先从共轭效应开始讲起吧 共轭效应是由于共轭体系的
  • 滤波器相位补偿

    概要 滤波器使用的过程中都会产生相位的改变 有时 相位的改变并不是我们想要的 例如 笔者在做Dolby Atmos的bass management的时候 希望将顶置的低频成分分割到左右通道或环绕通道 因为相位的缘故 叠加之前 左右通道或环绕
  • windows

    1 准备工作 准备U盘 格式化U盘 注意选择格式化的文件系统 可以鼠标右键C盘查看 然后将U盘格式化 好像是跟电脑引导模式相关UEFI gt NTFS 如果格式化的时候没有选对文件系统 那么在BIOS界面可能无法识别到U盘 进入官网下载制作
  • 04_kibana 7.4.2 安装和配置指南

    本文大纲 1 Kibana 的下载方式 1 官网直接下载 2 Linux 服务器直接下载 需要能够访问互联网的服务器 2 修改配置 3 kibana 的关闭和重启 首先 值得高兴的是kibana7 x 已经有官方中文的啦 更加方便我们的开发
  • WebGL系列 - 裁剪空间矩阵优化

    该系列仅为记录自己的学习相关知识 以 2d 的顶点着色器为例
  • 模型评估相关参数学习

    training process loss accurancy val loss val accurancy testing process classification report label predict digits 8 labe
  • 【服务器】交换机带外管理和带内管理

    一 交换机的带外管理是什么 在带外管理模式中 网络的管理控制信息与用户网络的承载业务信息在不同的逻辑信道传送 带外管理最大的优势在于 当网络出现故障中断时数据传输和管理都可以正常进行 不同的物理通道传送管理控制信息和数据信息 两者完全独立
  • Activiti 学习(二)—— Activiti 流程定义和部署

    概述 在这一节 我们将创建一个 Activit 工作流 并启动这个流程 主要包含以下几个步骤 定义流程 按照 BPMN 的规范 使用流程定义工具 用流程符号把整个流程描述出来 部署流程 把画好的流程定义文件 加载到数据库中 生成表的数据 流