Activiti7工作原理

2023-11-04 04:12
文章标签 工作 原理 activiti7

本文主要是介绍Activiti7工作原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java Activiti是一个开源的工作流引擎,用于管理和执行业务流程。
它是基于BPMN 2.0标准的,提供了丰富的功能和灵活性。

Java Activiti的工作原理如下:

1.Java Activiti 流程建模

使用BPMN 2.0标准的图形化编辑器,可以创建和定义业务流程模型。这些模型描述了流程中的各个任务、活动、网关、事件等。
使用工具:
InteliJ IDEA 插件:Activiti BPMN visualizer
在这里插入图片描述
使用方法参考:https://blog.csdn.net/qq_51726114/article/details/124363712

插件安装后,新建文件,画流程图:
在这里插入图片描述
注意上面的四个参数,后面会用于定位这个节点。

2. Java Activiti 流程部署

将流程模型部署到Activiti引擎中,引擎会解析和存储流程定义相关的信息,包括流程图、任务分配、表单等。
流程部署核心代码:

@Autowiredprivate ProcessEngine processEngine;public static final String processDefinitionKey = "fbr_1";public static final String resourceFilePath = "/process/fbr_1.bpmn20.xml";public static final String resourceName = "fbr_1.bpmn20.xml";@GetMapping("/deploy")public ApiResult create() {InputStream inputStream = ResourceFileUtils.loadFile(resourceFilePath);// 获取流程定义和部署对象相关的ServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 创建部署对象Deployment deployment = repositoryService.createDeployment().name("Build FBR Request Process")// 声明流程的名称.addInputStream(resourceName, inputStream)// 加载资源文件,一次只能加载一个文件.deploy();// 完成部署//4.输出部署的一些信息System.out.println(deployment.getId());System.out.println(deployment.getName());return ApiResult.ok();}

部署后,会在三张元数据表中写入数据:

-- 部署信息 
-- id关联 下面两张表
select * from ACT_RE_DEPLOYMENT where name_ ='Build FBR Request Process'  order by deploy_time_ desc;
-- 流程元数据:含流程图等字段 
-- deploy_id_ 关联
select * from ACT_GE_BYTEARRAY where name_ ='fbr_1.bpmn20.xml';
-- 流程定义数据
-- deploy_id_ 关联
select * from ACT_RE_PROCDEF where key_ ='fbr_1';

这三张表的元数据,会始终保存,不同于下面会讲到的四张表实例数据表,流程最终完成后,所有实例数据会清除掉。

3. Java Activiti 流程实例化(启动流程)

通过Activiti引擎,可以根据已部署的流程定义创建流程实例。每个流程实例代表了一个具体的业务流程执行过程。
启动流程时,流程会处于第一个结点(开始结点后的第一个结点),想要获取节点信息,需要通过该节点配置的属性进行查询;
启动流程核心代码:

    @GetMapping("/start")public ApiResult start(@RequestParam("assingee") String assingee) {TaskService taskService = processEngine.getTaskService();RuntimeService runtimeService = processEngine.getRuntimeService();Map<String, Object> param = new HashMap<>();param.put("submitter", assingee);// 流程必须要有发起人,否则会报错提示;// 一般同流程文件名称ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, param);//4.输出实例的相关信息System.out.println("流程部署id:" + processInstance.getDeploymentId());//nullSystem.out.println("流程定义id:" + processInstance.getProcessDefinitionId());//fbr_1:2:5f8494b9-7a0a-11ee-b0d9-4e796eddc638System.out.println("流程实例id:" + processInstance.getId());//e464157a-7a0a-11ee-b0d9-4e796eddc638System.out.println("流程活动id:" + processInstance.getActivityId());//nullreturn ApiResult.ok();}

流程启动后,会在四张数据表中写入第一个结点的数据:

-- 流程任务表,
-- ACT_RU_TASK.proc_def_id=ACT_RE_PROCDEF.id
-- proc_inst_id 根节点 实列 id,结点变换也会一直不变,只会改变 name等字段
select * from ACT_RU_TASK where proc_def_id_ ='fbr_1:2:5f8494b9-7a0a-11ee-b0d9-4e796eddc638' order by create_time_ desc;-- 实例表,是一个维表,
select *  from ACT_RU_EXECUTION 
where proc_def_id_ ='fbr_1:2:5f8494b9-7a0a-11ee-b0d9-4e796eddc638' 
and root_proc_inst_id_ ='e464157a-7a0a-11ee-b0d9-4e796eddc638'
order by start_time_ desc;-- user表
-- 同 ACT_RU_IDENTITYLINK.TASK_ID_=ACT_RU_EXECUTION.id 关联
select *  from ACT_RU_IDENTITYLINK 
where 1=1
and (proc_inst_id_ ='e464157a-7a0a-11ee-b0d9-4e796eddc638'
or task_id_ ='e480c53d-7a0a-11ee-b0d9-4e796eddc638'
)
-- 运行时变量;
-- 同流程任务表 ACT_RU_TASK.proc_inst_id 关联,
select * from ACT_RU_VARIABLE  
where proc_inst_id_ ='e464157a-7a0a-11ee-b0d9-4e796eddc638'

4. Java Activiti 任务分配(获取结点任务)

根据流程定义中定义的任务分配规则,Activiti引擎会将任务分配给相应的参与者或角色。参与者可以是用户、组织或其他参与者。

核心代码:

    @GetMapping("/getTaskList")public void getTaskList(@RequestParam("assignee") String assignee) {//1.得到ProcessEngine对象//2.得到TaskService对象TaskService taskService = processEngine.getTaskService();//3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询//获取任务集合 (ACT_RU_TASK 数据,task.getId等所有数据皆属于该表字段)List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey)// 指定流程id.processDefinitionName("fbr_1")// 指定流程名称.taskCandidateUser(assignee)// 指定接收人.taskName("提交请假申请")// 指定结点name.list();for (Task task : taskList) {System.out.println("任务ID:" + task.getId());System.out.println("任务名称:" + task.getName());System.out.println("任务的创建时间:" + task.getCreateTime());System.out.println("任务的办理人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("执行对象ID:" + task.getExecutionId());System.out.println("流程定义ID:" + task.getProcessDefinitionId());System.out.println("#########################################################");}}

assignee 只代表一种参数,taskCandidateUser也只代表一种查询方式,
具体需要根据流程图的配置字段来。

核心 SQL 语句:

 selectdistinct RES.*
fromACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I onI.TASK_ID_ = RES.ID_
inner join ACT_RE_PROCDEF D onRES.PROC_DEF_ID_ = D.ID_
whereRES.NAME_ = '提交请假申请'and D.KEY_ = 'fbr_1'and D.NAME_ = 'fbr_1'and RES.ASSIGNEE_ is nulland I.TYPE_ = 'candidate'and ( I.USER_ID_ = 'leiming5'or I.GROUP_ID_ in ('activitiTeam') )
order byRES.ID_ asc

5. 任务执行(让任务动起来)

参与者可以通过Activiti引擎完成分配给他们的任务。任务可以包括用户任务、服务任务、脚本任务等。

执行任务就是完成当前结点的任务,流程进入下一个节点,
这里需要将下个节点的数据(也可以是数据id,不存放具体数据)和审批人传入;使得下个节点的审批人能收到

核心代码:

    @GetMapping("/complete")public ApiResult complete(@RequestParam("assignee") String assignee) {TaskService taskService = processEngine.getTaskService();List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey)// 指定流程id.processDefinitionName("fbr_1")// 指定流程名称.taskCandidateUser(assignee)// 指定接收人.taskName("提交请假申请")// 指定结点name.list();//4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()for (Task task : taskList) {Map<String, Object> param = new HashMap<>();param.put("person_1", "a,b");// 将下个节点的 审批人传入;使得下个节点的审批人能收到;param.put("person_2", "c,d");taskService.complete(task.getId(), param);//5.输出任务的idSystem.out.println(task.getId());}return ApiResult.ok();}
核心 sql :

更新第三步中的四张表:删除当前结点的数据,新增下一个结点的数据。
ACT_RU_TASK.proc_inst_id 不会变,只会改变结点的其他属性。

6. 流程控制

在流程执行期间,Activiti引擎会根据流程定义中定义的条件和网关,控制流程的走向和执行顺序。这包括并行网关、排他网关、事件网关等。

7. 监控和管理

Activiti引擎提供了监控和管理工具,可以跟踪和管理流程实例的执行情况,包括任务状态、流程进度、异常处理等。

这篇关于Activiti7工作原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343162

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们