四川网站建设公司/关系网站优化公司
背景
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、…...

页面置换算法
页面置换算法 在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置换算法…...

算法导论【在线算法】—The Ski-Rental Problem、The Lost Cow Problem、The Secretary Problem
算法导论【在线算法】The Ski-Rental Problem问题描述在线算法证明The Lost Cow Problem问题描述在线算法类似问题—寻宝藏The Secretary Problem问题描述在线算法The Best Possible kThe Ski-Rental Problem 问题描述 假设你正在上滑雪课。每节课结束后,你决定&a…...

linux 下怎样给pdf 文件加书签
linux 下怎样给pdf 文件加书签 对于没有书签的pdf文件,怎样给pdf加标签呢? 以方便阅读. 以前总是要借助windows下pdf 工具, 叫什么来者? 忘了 记得是编辑一个用tab表示目录级别的文本文件, 有一种直观的感觉,大目录下嵌套着小目录 ..., 然后导入到文件中 linux 下有没有这种…...

[软件工程导论(第六版)]第2章 可行性研究(课后习题详解)
文章目录1. 在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?2. 为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名…...

[软件工程导论(第六版)]第3章 需求分析(课后习题详解)
文章目录1. 为什么要进行需求分析?通常对软件系统有哪些需求?2. 怎样与用户有效地沟通以获取用户的真实需求?3. 银行计算机储蓄系统的工作过程大致如下:储户填写的存款单或取款单由业务员输入系统,如果是存款则系统记录…...

基于分布鲁棒联合机会约束的能源和储备调度(Matlab代码实现)
👨🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…...

ETL和数据建模
一、什么是ETL ETL是数据抽取(Extract)、转换(Transform)、加载(Load )的简写,它是将OLTP系统中的数据经过抽取,并将不同数据源的数据进行转换、整合,得出一致性的数据&…...

ccc-pytorch-回归问题(1)
文章目录1.简单回归实战:2.手写数据识别1.简单回归实战: 用 线性回归拟合二维平面中的100个点 公式:ywxbywxbywxb 损失函数:∑(yreally−y)2\sum(y_{really}-y)^2∑(yreally−y)2 迭代方法:梯度下降法,…...

【JAVA八股文】框架相关
框架相关1. Spring refresh 流程2. Spring bean 生命周期3. Spring bean 循环依赖解决 set 循环依赖的原理4. Spring 事务失效5. Spring MVC 执行流程6. Spring 注解7. SpringBoot 自动配置原理8. Spring 中的设计模式1. Spring refresh 流程 Spring refresh 概述 refresh 是…...

二叉树的相关列题!!
对于二叉树,很难,很难!笔者也是感觉很难!虽然能听懂课程,但是,对于大部分的练习题并不能做出来!所以感觉很尴尬!!因此,笔者经过先前的那篇博客,已…...