流程引擎之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、…...
别再让电机乱转了!手把手教你用STM32的TIM3和L298N实现精准PWM调速(附完整工程源码)
STM32与L298N电机控制实战:从原理到精准调速的完整指南 在智能小车、机械臂或自动化设备开发中,直流电机控制是最基础却最容易出问题的环节。很多初学者在第一次连接STM32和L298N驱动模块时,都会遇到电机不转、乱转或速度不稳的情况。本文将彻…...
从FreeRTOS到RT-Thread:手把手教你正确使用操作系统的动态内存API(避坑malloc)
从FreeRTOS到RT-Thread:嵌入式实时操作系统动态内存管理实战指南 在嵌入式开发领域,动态内存管理一直是开发者面临的棘手问题之一。当项目从裸机迁移到实时操作系统(RTOS)环境时,许多开发者会不自觉地延续使用标准C库的…...
书成紫微动,律定凤凰驯:一破一立,铁哥的两部作品如何构成完整的文化闭环
书成紫微动,律定凤凰驯。 —— 唐《开元占经》卷一〇三 引言:千年谶语里的文明算法 无破则旧局不死,无立则新局不生。 一句千古古句,藏着文明迭代最严谨的底层逻辑: 先破后立,破立相生,方能形成…...
保姆级教程:手把手教你用‘版本降级法’搞定PyTorch 1.9.1 + CUDA 11.1环境搭建
深度学习环境搭建实战:PyTorch与CUDA版本兼容性终极指南 引言 当你第一次尝试在Windows系统上搭建PyTorch深度学习环境时,可能会遇到各种令人困惑的错误信息。其中最常见的就是"no matching distribution found"这类版本兼容性问题。本文将以一…...
十六呀,今天对我们都是很特殊的一天吧
今天对你坦白了 不是表白,是坦白 说了一些你早就知道的话 我说我想放下了 我说交给时间 不是我真的想放下 是我没有别的选择了 就做好朋友吧 如果你还愿意的话 我们会是很好的朋友 放下吧,如果真的可以,真的甘心的话。 好久好久之后 也许真的…...
5个技巧快速掌握Fire Dynamics Simulator:从零到火灾模拟专家的完整指南
5个技巧快速掌握Fire Dynamics Simulator:从零到火灾模拟专家的完整指南 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 你是否曾好奇,当火灾发生时,烟雾如何在建筑中扩散࿱…...
当Cox回归的比例风险假定被违背时,除了时依协变量还能怎么办?
当Cox回归的比例风险假定被违背时的五维解决方案 在生存分析领域,Cox比例风险模型因其半参数特性和对基准风险函数形式不做假设的优势,成为医学研究、工程可靠性分析等领域的标配工具。但当这个金标准遇到比例风险假定(PH假定)被违背的情况时,…...
Austroads:速度管理证据与指导回顾(英) 2026
这份报告是澳大利亚和新西兰道路运输委员会(Austroads)2025 年发布的《车速管理证据与指南回顾》,核心是为更新《道路安全指南:安全车速》(AGRS Part 3)梳理研究证据、 stakeholder 反馈并给出修订建议。下…...
智能定时任务管理:用自然语言替代Crontab,TickGPTick项目实践
1. 项目概述:一个能“听懂”你需求的定时任务管理器最近在折腾一个自动化脚本项目时,我又一次陷入了“定时任务”的泥潭。相信很多开发者都有同感:写个脚本容易,但想让它定时、可靠、有状态地跑起来,总得和 crontab、s…...
3个关键步骤:如何为视频下载工具扩展新平台支持
3个关键步骤:如何为视频下载工具扩展新平台支持 【免费下载链接】yt-dlp-gui Windows GUI for yt-dlp 项目地址: https://gitcode.com/gh_mirrors/yt/yt-dlp-gui 为开源视频下载工具添加第三方平台支持是开发者面临的常见挑战。yt-dlp-gui作为Windows平台上广…...
