流程引擎之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、…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
