【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

news2025/3/1 10:41:30

本文将介绍Activiti7基础概念及基于Spring Boot整合Activiti7(流程设计器)的具体步骤。

作者:后端小肥肠

 1. 前言

        在企业级应用中,业务流程的管理和执行是至关重要的一环。Activiti7是一个强大的开源工作流引擎,它提供了灵活的流程定义、任务分配和执行监控功能。本篇博客将介绍Activiti7的相关概念,并详细讨论如何与Spring Boot整合。

2. Activiti7相关概念介绍

2.1. 什么是工作流

        工作流的简单概念就是用于流程审批的。 如:请假审批流程、报销审批流程、出差审批流程合同审批流程等。 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目 标的实现”。 工作流引擎,主要是为了帮助我们实现流程自动化控制,对应的Activiti引擎就可以实现自动化控制。 工作流管理系统是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。

2.2. 工作流应用场景

工作流应用场景:

业务类:合同审批流程、订单处理流程、出入库审批流程等。

行政类:请假流程、出差流程、用车流程、办公用品申请流程等。

财务类:报销流程、支付流程等。

客户服务类:售后跟踪、客户投诉等。

2.3. 什么是Activiti

        Activiti 是由 jBPM (BPM,Business Process Management 即业务流程管理) 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。

         Activiti 是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调 度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于Java的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。 Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形 式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。

         Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台,其核心是使用Java开发的快 速、稳定的BPMN 2.0流程引擎。Activiti是在ApacheV2许可下发布的,可以运行在任何类型的Java程序中,例如服务器、集群、云服务等。Activiti可以完美地与Spring集成。同时,基于简约思想的设计使Activiti非常轻量级。 官网: https://www.activiti.org/

2.4. Activiti开发流程

  1. 画流程定义模型: 遵守BPMN的流程规范,使用BPMN的流程定义工具,通过流程符号把整个业务流程定义出来,可以将流程定义文件字节流保存到模型数据表中(Model);
  2. 部署流程定义: 加载画好的流程定义文件,将它转换成流程定义数(ProcessDefinition),保存到流程定义数据表中;
  3. 启动流程(提交流程申请): 生成流程实例数据(ProcessInstance),生成第1节点任务数据(Task);
  4. 处理人审批流程节点任务: 完成任务审批,生成审批结果,生成下一节点任务数据。

2.5. BPMN 2.0 规范是什么

        业务流程模型注解(Business Process Modeling Notation - BPMN)是业务流程模型的一种标准图形注解。这个标准是由对象管理组(Object Management Group - OMG)维护的。

         标准的早期版本(1.2版以及之前)仅仅限制在模型上, 目标是在所有的利益相关者之间形成通用的理解, 在文档,讨论和实现业务流程之上。 BPMN标准证明了它自己,现在市场上许多建模工具都使用了BPMN标准中的元素和结构。 BPMN规范的2.0版本,当前已经处于最终阶段了, 允许添加精确的技术细节在BPMN的图形和元素中, 同时制定BPMN元素的执行语法。 通过使用XML语言来指定业务流程的可执行语法, BPMN规范已经演变为业务流程的语言, 可以执行在任何兼容BPMN2的流程引擎中, 同时依然可以使用强大的图形注解。

        目前BPMN2.0是最新的版本,它用于在BPM上下文中进行布局和可视化的沟通。BPMN 2.0是使用一些符号来明确 业务流程设计流程图的一整套符号规范,它能增进业务建模时的沟通效率。

2.6. BPMN 2.0 基本流程符号(补充)

事件 Event:

开始事件

边界事件: 

 

中间捕获事件: 

结束事件:

活动 Activity:

        活动是工作或任务的一个通用术语。一个活动可以是一个任务,还可以是一个当前流程的子处理流程; 其次,你还 可以为活动指定不同的类型。常见活动如下:

网关 Gateway

        排他网关 (x): 只有一条路径会被选择。流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流; 如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。 排他网关需要和条件顺序流结合使用,default属性指定默认顺序流,当所有的条件不满足时会执行默认顺序 流。

        并行网关 (+) :所有路径会被同时选择。分支: 并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。 汇聚 :所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。

        包容网关 (o) :可以同时执行多条线路,也可以在网关上设置条件。分支:计算每条线路上的表达式,当表达式计算结果为true时,创建一个并行线路并继续执行。 汇聚:所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行。

        事件网关 (o+) :专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态。

定时器事件

        开始定时器事件: 可以设置时间,定时开始启动流程实例。

        中间定时器事件: 设定延迟时间,当完成任务1后,到达延时时间,流程才会走向任务2。

        边界定时器事件: 用于向某节点上添加边界定时事件。在设定时间内没有完成,流程实例则自动走向下一节点。

3. Spring Boot整合Activiti7简介

3.1. 开发环境搭建

3.1.1. 所用版本工具
依赖版本
Spring Boot2.5.0
activiti7.1.0.M5
MybatisPlus3.3.1
postgres13.12
3.1.2. pom依赖
<dependencies>
        <!-- 依赖管理-->
        <dependency>
            <groupId>org.activiti.dependencies</groupId>
            <artifactId>activiti-dependencies</artifactId>
            <version>${activiti.version}</version>
            <type>pom</type>
        </dependency>

        <!-- Activiti -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>${activiti.version}</version>
            <!--上面用了mybatis-plus,要排除这个-->
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- java代码绘activiti流程图 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-image-generator</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- activiti json转换器-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- svn转换png图片工具 -->
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-all</artifactId>
            <version>1.10</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- web启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybatis-plus启动器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- swagger 接口文档-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>
        <!-- springboot2.3.1后要单独引入,swagger才可以用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

    </dependencies>

3.2. 整合流程模型设计器 Activiti Modeler

        Activiti 官方提供了 Web 版的流程设计工具 Activiti Modeler,可以直接整合到我们项目中。在 Activiti 5.10 版本把原本独立的 Activiti Modeler 模块整合到了 Activiti Explorer 模块中,两者相结合使用起来很方便, 通过 Modeler 设计的流程模型可以直接部署到引擎,也可以把已经部署的流程转换为Model从而在Modeler中编辑。 在实际应用中也有这样的需求,把 Modeler 整合到业务系统中可以供管理员使用,或者作为BPM流程管理平台的 一部分存在。 但是在 Activiti 官方没有给出如何整合Modeler的文档,要我们自己整合。

3.2.1. 下载源码

首先需要从 Github下载 Activiti 5.22 版本源码 访问: https://github.com/Activiti/Activiti/releases/tag/activiti-5.22.0 下载 zip 格式的压缩包: https://github.com/Activiti/Activiti/archive/activiti-5.22.0.zip

 

3.2.2. 拷贝目标源码

1. 解压 Activiti-activiti-5.22.0.zip ,然后进入 Activiti-activiti-5.22.0/modules 目录

2. 复制 activiti-webapp-explorer2 工程中如下图画红框的文件夹和文件

粘贴到项目工程的 resources/static 目录下(static 目录创建)

3. 找到activiti-modeler工程下的3个类,如下:

拷贝到项目工程·的activiti包下(或者你自己命名的包):

3.2.3. 修改上下文路径

1.在项目工程中修改文件中上下文路径,这样才能请求到上面3 个接口

上下文路径对应 application.yml 文件中配置的 server.servlet.context-path=/workflow

3.2.4. 汉化 Activiti Modeler

汉化文件位于:https://download.csdn.net/download/c18213590220/88875425?spm=1001.2014.3001.5503

1. 汉化页面文字,在 resources/static/ 目录下添加 stencilset.json 文件。

2. 需要修改 StencilsetRestResource.java 类中 stencilset.json 为 static/stencilset.json(最前面不要有/);

3. 汉化按钮文字,添加zh-CN.json文件。在src/main/resources/static/editor-app/i18n目录下添加zh-CN.json文件。

4. 修改src/main/resources/static/editor-app/app.js文件。将第51行替换为以下内容:

// $translateProvider.preferredLanguage('en');
 // 多语言支持
if("zh-CN" == navigator.language){
 $translateProvider.preferredLanguage('zh-CN');
 }else {
 $translateProvider.preferredLanguage('en');
 }

启动项目时报错:

 Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.

解决:重新编译下,然后再启动项目。

3.2.5. 创建空流程模型

1. 创建一个 ModelController 模型控制器,用于创建空流程模型和跳转到模型设计页面 modeler.html

/**
 * 模型设计控制层
 */
@Controller
@RequestMapping("/model")
public class ModelController {

    @Autowired
    RepositoryService repositoryService;

    @Autowired
    ObjectMapper objectMapper;

    @GetMapping("/create") // /workflow/model/create
    public void create(HttpServletRequest request, HttpServletResponse response) {
        try {
            String name = "请假流程模型";
            String key = "leaveProcess";
            String desc = "请输入描述信息……";
            int version = 1;

            // 1. 初始空的模型
            Model model = repositoryService.newModel();
            model.setName(name);
            model.setKey(key);
            model.setVersion(version);

            // 封装模型json对象
            ObjectNode objectNode  = objectMapper.createObjectNode();
            objectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
            objectNode.put(ModelDataJsonConstants.MODEL_REVISION, version);
            objectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, desc);
            model.setMetaInfo(objectNode.toString());
            // 保存初始化的模型基本信息数据
            repositoryService.saveModel(model);

            // 封装模型对象基础数据json串
            // {"id":"canvas","resourceId":"canvas","stencilset":{"namespace":"http://b3mn.org/stencilset/bpmn2.0#"},"properties":{"process_id":"未定义"}}
            ObjectNode editorNode = objectMapper.createObjectNode();
            ObjectNode stencilSetNode = objectMapper.createObjectNode();
            stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
            editorNode.replace("stencilset", stencilSetNode);
            // 标识key
            ObjectNode propertiesNode = objectMapper.createObjectNode();
            propertiesNode.put("process_id", key);
            editorNode.replace("properties", propertiesNode);

            repositoryService.addModelEditorSource(model.getId(), editorNode.toString().getBytes("utf-8"));
            response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + model.getId());
//            response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=9fceea3b-c23b-11ed-b0a5-201e88269a86");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 2. 重启mengxuegu-activiti-boot项目.

3. 访问 http://localhost:8080/workflow/model/create , 会重定向到http://localhost:8080/workflow/modeler.html?modelId=xxxxxxxx

3.2.6. 绘制流程定义模型涉及表

ACT_RE_MODEL 流程模型基本信息表。

ACT_GE_BYTEARRAY 流程模型描述 json 串(注意不是xml串)和 流程图字节码。

4. 结语

        本文对Activi7的相关概念进行了简要介绍,同时还对Spring Boot整合Activi7模型设计器的步骤进行了讲解,下期将以成品demo为例介绍基于Activiti7的工作流管理系统的实现,感兴趣的同学可动动你们发财的小手点点关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux---安使用nginx

目录 一、编译安装Nginx 1、关闭防火墙&#xff0c;将安装nginx所需要软件包传到/opt目录下 ​编辑2、安装依赖包 3、创建运行用户、组 4、编译安装nginx 5、创建软链接后直接nginx启动 ​编辑 6、创建nginx自启动文件 ​编辑6.1 重新加载配置、设置开机自启并开启服务…

Kafka之Producer源码

Producer源码解读 在 Kafka 中, 我们把产生消息的一方称为 Producer 即 生产者, 它是 Kafka 的核心组件之一, 也是消息的来源所在。它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某个分区上。那么这些生产者产生的消息是怎么传到 Kafka 服务端的呢&a…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

SpringBoot实现热插拔AOP

热插拔AOP执行核心逻辑 Advice&#xff1a;“通知”&#xff0c;表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” and “after 等 Advice&#xff0c;大体上分为了三类&#xff1a;BeforeAdvice、MethodInterceptor、AfterAdviceAdvisor&#xff1a…

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX

STM32存储左右互搏 QSPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Quad SPI总线实现FATS文件操作W25Q各型号…

智能SQL生成:后端技术与LLM的完美结合

文章目录 引言一、什么是大模型二、为什么选择LLM三、开发技术说明四、系统架构说明五、编码实战1. Maven2. 讯飞大模型配置类3. LLM相关的封装4. 编写LLM的service5. 编写controller6. 运行测试 六、总结 引言 本篇文章主要是关于实现一个类似Chat2DB的根据自然语言生成SQL的…

SpringMVC 学习(四)之获取请求参数

目录 1 通过 HttpServletRequest 获取请求参数 2 通过控制器方法的形参获取请求参数 3 通过 POJO 获取请求参数&#xff08;重点&#xff09; 1 通过 HttpServletRequest 获取请求参数 public String handler1(HttpServletRequest request) <form action"${pageCont…

微信小程序02: 使用微信快速验证组件code获取手机号

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 微信小程序获取手机号2.1 业务场景(使用与充值)2.2 准备工作2.3 具体代码使用与注释如下2.3.1 代码解释(一)[无需复制]2.3.2 代码解释(二)[无需复制] 2.4 最后一步 获取手机号信息2.4.1 两行代…

电商评价分析:NLP信息抽取技术在用户评论中的应用与挖掘

一、引言 在2019年&#xff0c;电子商务的蓬勃发展不仅推动了消费市场的增长&#xff0c;也带来了海量的用户评价数据。这些数据&#xff0c;作为消费者对商品和服务直接反馈的载体&#xff0c;蕴含着巨大的价值。然而&#xff0c;由于其非结构化的特性&#xff0c;这些文本信息…

YOLOv8改进 | Conv篇 | 全新的SOATA轻量化下采样操作ADown(参数量下降百分之二十,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)…

半导体物理基础-笔记(续)

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 掺杂半导体的费米能级与温度及杂质浓度的关系图 在温度一定的条件下&#xff0c;施主杂质浓度越高&#xff0…

压力测试工具Jmeter的下载与使用

1、进入官网下载Jmeter https://jmeter.apache.org/ 国内镜像&#xff08;下载的慢的话可以用国内镜像下载&#xff09; https://mirrors.cloud.tencent.com/apache/jmeter/binaries/ 2、跳转到下载页面 3、根据不同系统下载相应版本的Jmeter压缩包&#xff0c;Linux系统下载…

Repeater:创建大量类似项

Repeater 类型用于创建大量类似项。与其它视图类型一样&#xff0c;Repeater有一个model和一个delegate。 首次创建Repeater时&#xff0c;会创建其所有delegate项。若存在大量delegate项&#xff0c;并且并非所有项都必须同时可见&#xff0c;则可能会降低效率。 有2种方式可…

2024年大路灯无广测评推荐:书客、柏曼、霍尼韦尔大路灯哪个品牌更好?

临近开学&#xff0c;护眼大路灯哪个品牌好的话题度在不断提高&#xff01; 有人说大路灯是“智商税”&#xff0c;但也有人说“学生党福音”、“照明神器”&#xff0c;吸引了大量人群的关注。在没用过大路灯之前我也很担心在担心是否是智商税的问题&#xff0c;直到我自己入…

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…

stable-diffusion-webui+sadTalker开启GFPGAN as Face enhancer

接上一篇&#xff1a;在autodl搭建stable-diffusion-webuisadTalker-CSDN博客 要开启sadTalker gfpgan as face enhancer&#xff0c; 需要将 1. stable-diffusion-webui/extensions/SadTalker/gfpgan/weights 目录下的文件拷贝到 :~/autodl-tmp/models/GFPGAN/目录下 2.将G…

探索创意的无尽宇宙——Photoshop 2020,你的视觉魔法棒

在数字艺术的广阔天地中&#xff0c;Photoshop 2020无疑是一颗璀璨的明星。这款由Adobe公司精心打造的图像处理软件&#xff0c;自推出以来&#xff0c;便以其强大的功能和卓越的性能&#xff0c;赢得了全球数百万设计师、摄影师和爱好者的青睐。无论是Mac还是Windows系统&…

冯诺依曼体系结构 与 操作系统

一、冯诺依曼体系结构 深入理解冯诺依曼体系结构 计算机的出现就是为了解决实际问题, 所以把问题交给计算机&#xff0c;计算机经过处理&#xff0c;得到一个结果反馈给我们&#xff0c;所以这中间就必然涉及到了输入设备&#xff0c;中央处理器(包括运算器和控制器)和输出设备…

Find My小风扇|苹果Find My技术与小风扇结合,智能防丢,全球定位

电风扇在我们的日常生活中也是经常会使用到的家电产品&#xff0c;尤其是在炎炎的夏日&#xff0c;风扇能给我们吹来清凉的凉风&#xff0c;如今随身携带的小风扇成为人们出门的必备物品&#xff0c;由于体积小方便经常会被人遗忘在某个地方导致丢失。 在智能化加持下&#x…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…