流程引擎之Activiti简介
背景
Activiti 是一个开源架构的工作流引擎,基于 bpmn2.0 标准进行流程定义,其前身是 jBPM,Activiti 相对于 jBPM 更轻量,更易上手,且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss,随之加入 Alfresco 后很快推出了新的基于 jBPM4 的开源工作流系统 Activiti5 :

附 Activiti 官方地址:
Activiti 官方主页:https://www.activiti.org/
Activiti github 代码:https://github.com/Activiti/Activiti
Activiti 官方文档:https://www.activiti.org/userguide/#_introduction
Activiti 使用
1)Activiti 官方 demo 使用
Activiti 官方提供了 demo 供初学者入门使用,使用流程如下(尽量参考官方文档):
Step 1:下载 activiti-6.0.0.zip,并解压,找到 activiti-admin.war、activiti-app.war、activiti-rest.war 所在目录

activiti-admin.war、activiti-app.war 和 activiti-rest.war 是 Activiti 官方提供的 demo 应用(详细使用可参考官方文档:https://www.activiti.org/userguide/):
activiti-admin.war:连接好 Activiti endpoint 后,可通过该模块查看流程定义、发起的流程实例、任务等
activiti-app.war:核心 Activiti demo,提供在线流程设计器、表单管理、应用管理、用户管理等功能
activiti-rest.war:提供 Restful 风格的服务
附 activiti-6.0.0.zip 下载地址:https://www.activiti.org/get-started
Step 2:将上述三个 war 包放到 tomact webapps 目录中,启动 tomcat
注意,tomcat 版本使用 Tomcat 9.0.0 以下,否则无法启动。
Step 3:activiti-admin 示例。访问 http://localhost:8080/activiti-admin,并账密(admin/admin)登录
activiti-admin 主要提供数据监控,访问时需要提前连接 Activiti endpoint,否则没有任何数据,这里配置了 activiti-app(主核心demo)的端口,即在 activiti-app demo 中操作的流程任务数据在这里都可以查看到。


Step 4:activiti-app 示例。访问 http://localhost:8080/activiti-app,并账密(admin/test)登录
activiti-app 是 Activiti 官方提供的核心 activiti demo,也可称为 Activiti UI,提供了在线流程设计器、任务管理和用户管理模块,运行时数据默认存储在 H2(也可修改配置来替换数据库),下图为示例页面:


Step 5:activiti-rest 示例。访问 http://127.0.0.1:8080/activiti-rest/docs/,并账密(kermit/kermit)登录
Activiti 包含一个连接到 Activiti engine 的 rest api,可以通过将 activiti-rest.war 文件部署到 servlet 容器(如Apache Tomcat)来安装该 API。默认情况下,Activiti engine 将连接到内存 H2 数据库(可以更改 WEB-INF/classes 文件夹中 db.properties 文件配置来修改数据库,Activiti 启动后会自动初始化 23 张数据表)。另外,可通过引入 rest api 依赖将 rest api 集成到项目中,不再详述。
更多详细有关 Activiti rest api 说明参考:https://www.activiti.org/userguide/#_rest_api

2)Activiti 请假 demo 示例
以请假流程作为 Activiti 基本使用示例(流程示例同上述 acitiviti-app 应用流程文件示例),员工发起请假,然后项目经理审批,再HR审批,最后CEO审批,若其中任意一个人拒绝,员工则需要重新提交流程。

其中 demo 示例如下,完整源码参考:https://download.csdn.net/download/zhuqiuhui/87462382


3)Activiti 与 Spring Boot 集成
Activiti 与 Spring Boot 集成比较简单,只需要要引入以下依赖即可(不再示例),详细参考 Activiti 官方文档与 Spring 集成章节:https://www.activiti.org/userguide/#springintegration
<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>${activiti.version}</version>
</dependency>4)Activiti 与 jBPM 对比
Activiti 与 Spring 天然集成,同时有基于 Web 的 Activiti 流程设计器(详细参考上述官方 demo 中的 activiti-app.war 使用),另外,Activiti 在表结构设计上遵循运行时与历史数据的分离,可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读取,这样大大的提高了数据的存取效率。
另外,相对于 jBPM,jBPM 与 jBoss 技术栈耦合太过紧密,国内社区不如 Activiti 活跃。
Activiti5 整体架构及相关核心类
Activiti5 整体架构

Activiti 工作流程如下:
Step 1:通过入口配置文件 activiti.cfg.xml 或者自定义 ProcessEngineConfiguration 实例,得到流程引擎配置
Step 2:由 ProcessEngineConfiguration实例得到 ProcessEngine 实例
Step 3:通过 ProcessEngine 实例得到 Activiti 提供所有接口服务
Step 4:执行流程引擎
使用示例:
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration().....;
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//......另外,Activiti 使用命令模式作为基础开发模式,流程引擎服务类(如TaskService等)中定义的各个方法都有对应用的命令对象(如开启流程命令:StartProcessInstanceCmd 等), 流程引擎服务类把各种请求委托成 xxCmd 交给 CommandExecutor 来执行,CommandExecutor 进一步交付给 CommandInterceptor 责任链来执行,xxCmd 来决定命令的接收者(参考 CommandContext),接收者执行后返回结果(参考下述 UML 图)。

Activiti5 核心类

1)EngineServices
该接口中定义了获取各种服务类实例对象的方法。
2)ProcessEngine 及默认实现类 ProcessEngineImpl
ProcessEngine 继承 EngineServices 接口,并增加了对流程引擎名称的获取以及关闭流程引擎的支持。ProcessEngineImpl 是 ProcessEngine 引擎的默认实现类,实际上是由 ProcessEngineConfigurationImpl 构造的,即 ProcessEngineImpl 调用 ProcessEngineConfigurationImpl 的方法获得服务。
3)ProcessEngineConfiguration 及默认实现 ProcessEngineConfigurationImpl
ProcessEngineConfiguration 是流程引擎配置类,ProcessEngineConfigurationImpl 继承 ProcessEngineConfiguration,负责创建一系列服务类实例对象、流程引擎实例对象以及ProcessEngineImpl 类实例对象,该类可以通过流程配置文件交给Spring容器管理或者使用编程方式动态构建。
常用的流程配置类如下:
StandaloneProcessEngineConfiguration:标准的流程引擎配置类
StandaloneInMemProcessEngineConfiguration:开发环境中自测使用,默认采用H2数据库存储数据。
.......
4)ProcessEngines
该类负责管理所有的流程引擎 ProcessEngine 集合,并负责流程引擎实例对象的注册、获取、注销等操作。
5)流程引擎服务类
RepositoryService
RepositoryService 是 Activiti 的资源管理类,提供流程定义和部署相关的存储服务。
RepositoryService repositoryService = processEngine.getRepositoryService();// 获取流程部署
Deployment deployment = repositoryService.createDeployment().addClasspathResource("MultiTask.bpmn").name("流程测试").category("").deploy();
// 获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();RuntimeService
RuntimeService 是 Activiti 的流程运行管理类,提供流程运行时相关的服务,如启动流程。
RuntimeService runtimeService = processEngine.getRuntimeService();// 启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", "Key001", vars);TaskService
TaskService 是 Activiti 的任务管理类,提供任务节点的操作接口(如complete、delete、delegate等)
TaskService taskService = processEngine.getTaskService();
// 获取任务列表
List<Task> taskList = taskService.createTaskQuery().taskAssignee("mary").orderByTaskCreateTime().desc().list();HistoryService
HistoryService 是 Activiti 的历史管理类,示例:
List<HistoricActivityInstance> historicActivityInstances = processEngine.getHistoryService()// 创建历史活动实例查询.createHistoricActivityInstanceQuery()//.finished() // 查询已经完成的任务.orderByHistoricActivityInstanceEndTime().asc().list();IdentityService
IdentityService 是 Activiti 的认证管理类,用于管理和查询用户、组之间的关系。
IdentityService identityService = processEngine.getIdentityService();
identityService.setAuthenticatedUserId("createUserId");......
6)JavaDelegate
作为 Activiti 的 ServiceTask 的实现,必须实现 JavaDelegate 接口,但是不需要实现序列化接口,Activiti 会使用反射机制将类初始化,因此在实现 JavaDelegate 接口的时候需要提供一个无参数的构造器,否则会抛出异常。
相关文章:
流程引擎之Activiti简介
背景Activiti 是一个开源架构的工作流引擎,基于 bpmn2.0 标准进行流程定义,其前身是 jBPM,Activiti 相对于 jBPM 更轻量,更易上手,且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss,随之加…...
4.打包子应用 投票
接上回 最终得到这样的目录 mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.pypolls/__init__.pyadmin.pyapps.pymigrations/__init__.py0001_initial.pymodels.pystatic/polls/images/background.gifstyle.csstemplates/polls/detail.htmlindex.htmlresult…...
华为OD机试 - 服务依赖(JavaScript) | 机试题算法思路 【2023】
服务依赖 题目 在某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如A依赖B,则当B故障时导致A也故障。 传递具有依赖性,如A依赖B,B依赖C,当C故障时导致B故障,也导致A故障。给出所有依赖关系以及当前已知故障服务…...
目标检测综述(一份全的自制PPT): 涵盖各种模型简介对比,适合入门和了解目标检测现状
[TOC](目标检测综述(一份全的自制PPT): 涵盖各种模型简介对比,适合入门和了解目标检测现状) 注:本文仅供学习,未经同意勿转。分享的PPT请勿二次传播,或者用于其他商用途径。若使用本文PPT请注明来源,感谢配合 前言&…...
Vulnhub-DC-2实战靶场
Vulnhub-DC-2实战靶场 https://blog.csdn.net/ierciyuan/article/details/127560871 这次试试DC-2,目标是找到官方设置的5个flag。 一. 环境搭建 1. 准备工具 虚拟机Kali: 自备,我的kali的IP为192.168.3.129 靶场机: https…...
从输入URL到渲染的过程中到底发生了什么?
CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来,再对其过程加以解释,了解过程中可以做哪些优化。文章内容有点长,需要有足够的耐心看完哟!&…...
旋转屏幕导致 Fragment 中的 onConfigurationChanged 被调用两次
环境 IDE Android Studio Dolphin 2021.3.1; 项目配置 Android Gradle plugin version: 7.1.3 Gradle Version: 7.2 Gradle JDK: 11 Compile Sdk Version: 32 问题描述 项目使用的 Bottom Navigation Activity 基本结构,在调试程序时发现,…...
23年校招DL/NLP/推荐系统/ML/算法基础面试必看300问及答案
2020年校招已经开始了,在疫情全球肆虐的背景下,全球就业情况异常艰难,加上美国对中国企业打压持续升级,对于马上开始秋招找工作的毕业生而言,更是难上加难。我们不能凭一己之力改变现状,但我们可以凭借自己…...
Python基础知识汇总(字符串二)
目录 检索字符串 count()方法 find()方法 in关键字 index()方法 rindex()方法 startswith()方法...
【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display
写在前面:本章主要内容为理解七点数码管显示的概念,并使用 Verilog 实现。生成输入信号后通过仿真确认各门的动作,通过 FPGA 检查在 Verilog 中实现的电路的操作。 Ⅰ. 前置知识 七段数码管是利用多重输出功能的非常有用的元件。该元件用于字…...
Android开发:Activity启动模式
1.怎样设置Activity的启动模式 可以在清单文件中自己添加活动的启动模式, android : launchMode"standard", 不写的话系统默认就是标准模式. 2.启动模式 2.1.默认启动模式 标准启动模式就是栈, 打开一个活动就将活动压入栈中, 返回就将活动退出栈中. 不同的Activit…...
01_Docker 简介
01_Docker 简介 文章目录01_Docker 简介1.1 Docker 简介1.2 Docker 组件1.2.1 Docker 客户端和服务区1.2.2 Docker 镜像1.2.3 Registry1.2.4 Docker 容器参考资料https://www.runoob.com/docker/ubuntu-docker-install.html 1.1 Docker 简介 Docker 是一个能够把开发的应用程…...
一文精通MVCC机制
MVCC(Multi-Version Concurrency Control)多版本并发控制机制使用串行化隔离级别时,mysql会将所有的操作加锁互斥,来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下,对一行数据的读和写两个操作默认是不会通过…...
商用ESP32协议采集器源码分享开篇
这是一个关于chatGPT帮助嵌入式程序员开发商业项目的故事. 在开发这个项目的过程中,chatGPT发布了,在它的帮助下,项目开发量减少了10%,所以这个专栏,既是一个关于Micropython开发ESP32的专栏,也是一个程序员在AI的帮助下,提升效率,加速挣钱的案例. 看完之后,你将知道如何用mic…...
代码随想录算法训练营第三十四天 | 860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球
一、参考资料柠檬水找零https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 根据身高重建队列 https://programmercarl.com/0406.%E6%A0%B9%E6%8D%AE%E8%BA%AB%E9%AB%98%E9%87%8D%E5%BB%BA%E9%98%9F%E5%88%97.html 用最少数量的箭引爆气球ht…...
DDR4介绍01
DDR4(第四代双倍数据率同步动态随机存储器SDRAM) 关于内存方面知识,大部分人、包括我自己也不是很懂,希望此篇文章能起到点作用,做硬件的就得把相关专业知识学牢了,尤其是专业术语。 下面是DDR4知识做一次…...
扫地机器人行业投资逻辑:国内以价换量元年,海外需求企稳回升
1、国内以价换量元年,投资逻辑由产品迭代转向行业的渗透率提升 2019-2022 年国内扫地机行业主要的投资逻辑是产品迭代的价增带动销额增长。 2019-2022 年国内热销的扫地机产品从单机向自清洁扫地机、全能基站扫地机持续迭 代升级,产品功能日益完善、瞄准用户痛点更新,真正实…...
(考研湖科大教书匠计算机网络)第四章网络层-第七节:IPv4数据报首部格式
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:IP数据报首部格式概述二:各字段作用概述(1)版本(2)首部长度和可选字段(3&am…...
每天10个前端小知识 【Day 18】
前端面试基础知识题 1.如何实现单行/多行文本溢出的省略样式? 在日常开发展示页面,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为了提高用户的使用体验,这个时候就需要…...
【Java集合类】ArrayList
内部结构 ArrayList内部核心是一个Object数组elementDataObject数组的长度(length)视为ArrayList当前的容量(capacity)size对象表示ArrayList当前的元素个数 类上的重要注释 内部是Object数组 允许put null值,会自动扩容 size、…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
