当前位置: 首页 > news >正文

流程引擎之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 是一个开源架构的工作流引擎&#xff0c;基于 bpmn2.0 标准进行流程定义&#xff0c;其前身是 jBPM&#xff0c;Activiti 相对于 jBPM 更轻量&#xff0c;更易上手&#xff0c;且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss&#xff0c;随之加…...

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): 涵盖各种模型简介对比&#xff0c;适合入门和了解目标检测现状) 注&#xff1a;本文仅供学习&#xff0c;未经同意勿转。分享的PPT请勿二次传播&#xff0c;或者用于其他商用途径。若使用本文PPT请注明来源&#xff0c;感谢配合 前言&…...

Vulnhub-DC-2实战靶场

Vulnhub-DC-2实战靶场 https://blog.csdn.net/ierciyuan/article/details/127560871 这次试试DC-2&#xff0c;目标是找到官方设置的5个flag。 一. 环境搭建 1. 准备工具 虚拟机Kali&#xff1a; 自备&#xff0c;我的kali的IP为192.168.3.129 靶场机&#xff1a; https…...

从输入URL到渲染的过程中到底发生了什么?

CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来&#xff0c;再对其过程加以解释&#xff0c;了解过程中可以做哪些优化。文章内容有点长&#xff0c;需要有足够的耐心看完哟&#xff01;&…...

旋转屏幕导致 Fragment 中的 onConfigurationChanged 被调用两次

环境 IDE Android Studio Dolphin 2021.3.1&#xff1b; 项目配置 Android Gradle plugin version: 7.1.3 Gradle Version: 7.2 Gradle JDK: 11 Compile Sdk Version: 32 问题描述 项目使用的 Bottom Navigation Activity 基本结构&#xff0c;在调试程序时发现&#xff0c…...

23年校招DL/NLP/推荐系统/ML/算法基础面试必看300问及答案

2020年校招已经开始了&#xff0c;在疫情全球肆虐的背景下&#xff0c;全球就业情况异常艰难&#xff0c;加上美国对中国企业打压持续升级&#xff0c;对于马上开始秋招找工作的毕业生而言&#xff0c;更是难上加难。我们不能凭一己之力改变现状&#xff0c;但我们可以凭借自己…...

Python基础知识汇总(字符串二)

目录 检索字符串 count()方法 find()方法 in关键字 index()方法 rindex()方法 startswith()方法...

【FPGA】Verilog:实现十六进制七段数码管显示 | 7-Segment Display

写在前面&#xff1a;本章主要内容为理解七点数码管显示的概念&#xff0c;并使用 Verilog 实现。生成输入信号后通过仿真确认各门的动作&#xff0c;通过 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)多版本并发控制机制使用串行化隔离级别时&#xff0c;mysql会将所有的操作加锁互斥&#xff0c;来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下&#xff0c;对一行数据的读和写两个操作默认是不会通过…...

商用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&#xff08;第四代双倍数据率同步动态随机存储器SDRAM&#xff09; 关于内存方面知识&#xff0c;大部分人、包括我自己也不是很懂&#xff0c;希望此篇文章能起到点作用&#xff0c;做硬件的就得把相关专业知识学牢了&#xff0c;尤其是专业术语。 下面是DDR4知识做一次…...

扫地机器人行业投资逻辑:国内以价换量元年,海外需求企稳回升

1、国内以价换量元年,投资逻辑由产品迭代转向行业的渗透率提升 2019-2022 年国内扫地机行业主要的投资逻辑是产品迭代的价增带动销额增长。 2019-2022 年国内热销的扫地机产品从单机向自清洁扫地机、全能基站扫地机持续迭 代升级,产品功能日益完善、瞄准用户痛点更新,真正实…...

(考研湖科大教书匠计算机网络)第四章网络层-第七节:IPv4数据报首部格式

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;IP数据报首部格式概述二&#xff1a;各字段作用概述&#xff08;1&#xff09;版本&#xff08;2&#xff09;首部长度和可选字段&#xff08;3&am…...

每天10个前端小知识 【Day 18】

前端面试基础知识题 1.如何实现单行&#xff0f;多行文本溢出的省略样式&#xff1f; 在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要…...

【Java集合类】ArrayList

内部结构 ArrayList内部核心是一个Object数组elementDataObject数组的长度&#xff08;length&#xff09;视为ArrayList当前的容量&#xff08;capacity&#xff09;size对象表示ArrayList当前的元素个数 类上的重要注释 内部是Object数组 允许put null值,会自动扩容 size、…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...