Activiti7工作原理

news2024/11/26 14:28:07

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引擎中,引擎会解析和存储流程定义相关的信息,包括流程图、任务分配、表单等。
流程部署核心代码:

@Autowired
    private 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);
        // 获取流程定义和部署对象相关的Service
        RepositoryService 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());//null
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());//fbr_1:2:5f8494b9-7a0a-11ee-b0d9-4e796eddc638
        System.out.println("流程实例id:" + processInstance.getId());//e464157a-7a0a-11ee-b0d9-4e796eddc638
        System.out.println("流程活动id:" + processInstance.getActivityId());//null

        return 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 语句:

 select
	distinct RES.*
from
	ACT_RU_TASK RES
inner join ACT_RU_IDENTITYLINK I on
	I.TASK_ID_ = RES.ID_
inner join ACT_RE_PROCDEF D on
	RES.PROC_DEF_ID_ = D.ID_
where
	RES.NAME_ = '提交请假申请'
	and D.KEY_ = 'fbr_1'
	and D.NAME_ = 'fbr_1'
	and RES.ASSIGNEE_ is null
	and I.TYPE_ = 'candidate'
	and ( I.USER_ID_ = 'leiming5'
		or I.GROUP_ID_ in ('activitiTeam') )
order by
	RES.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.输出任务的id
            System.out.println(task.getId());
        }
        return ApiResult.ok();
    }
核心 sql :

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

6. 流程控制

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

7. 监控和管理

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

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

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

相关文章

基于饥饿游戏算法的无人机航迹规划-附代码

基于饥饿游戏算法的无人机航迹规划 文章目录 基于饥饿游戏算法的无人机航迹规划1.饥饿游戏搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用饥饿游戏算法来优化无人机航迹规划。 …

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口&#xff0c;使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间&#xff0c;这使得容器之间可以使用独立的IP地址&#xff0c;并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

JOSEF约瑟 数显三相电压继电器 HJY-931A/D 导轨安装

名称&#xff1a;数字交流三相电压继电器型号&#xff1a;HJY-93系列品牌&#xff1a;JOSEF约瑟电压整定范围&#xff1a;10~450VAC额定电压&#xff1a;200、400VAC功率消耗&#xff1a;≤5W HJY系列 数字交流三相电压继电器 系列型号 HJY-931A/D数字式交流三相电压继电器&am…

吴恩达《机器学习》5-6:向量化

在深度学习和数值计算中&#xff0c;效率和性能是至关重要的。一个有效的方法是使用向量化技术&#xff0c;它可以显著提高计算速度&#xff0c;减少代码的复杂性。接下来将介绍向量化的概念以及如何在不同编程语言和工具中应用它&#xff0c;包括 Octave、MATLAB、Python、Num…

lvgl生成图片

网址&#xff1a;https://lvgl.io/tools/imageconverter CF_TRUE_COLOR:可以生成565&#xff0c;232&#xff0c;等多种形式的数组&#xff0c;选择Carray,会生成C数组。

2023.11.2事件纪念

然而造化又常常为庸人设计,以时间的流逝,来洗涤旧迹,仅以留下淡红的血色和微漠的悲哀。 回顾这次事件&#xff0c;最深的感触就是什么是团队的力量&#xff01; 当我们看到希望快要成功的时候&#xff0c;大家洋溢出兴奋开心的表情&#xff0c;一起的欢声笑语&#xff1b;但看…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起&#xff0c;抖音成为了人们日常生活中不可或缺的一部分&#xff0c;许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而&#xff0c;要想在抖音上获得更多的关注和收益&#xff0c;需要投入大量的时间和精力&#xff0…

【C语言初学者周冲刺计划】3.2将一个数组中的值逆序重新存放

目录 1解题思路&#xff1a; 2代码 3运行代码如图&#xff1a; 4总结&#xff1a; 1解题思路&#xff1a; 首先学会如何利用循环输入位数和输入数值&#xff0c;然后再利用循环逆序即可 2代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int…

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载 【软件试用版下载、软件资讯或技术支持服务可以点击文章最下方官网】 佳易王钟表养护维修管理系统V16.3&#xff0c;录入维修订单&#xff0c;维修进度查询&#xff0c;会员活动方案&#xff0c;打印服务报…

并发安全问题之--锁失效和锁边界问题

并发安全问题之–锁失效和锁边界问题 此处为新增insert无法在SQL中通过数量限制(除非插入SQL中有子查询)&#xff0c;上面改进的乐观锁失效&#xff08;前一节的乐观锁适合修改数据&#xff09; 故使用悲观锁&#xff0c;synchronized如果加在方法上范围是this是整个service&…

OSG多视口创建:osgViewer::CompositeViewer

1、效果 在osg的实际应用场景中&#xff0c;有时候需要同时创建多个场景视图&#xff0c;并保证各个场景视图中有不一样的显示和操作&#xff1a;例如&#xff1a;漫游器、照相机、粒子效果、多个模型组合等。此时就要用到OSG提供的osgViewer::CompositeViewer类来实现这个需求…

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言&#xff0c;前端使用HTML、CSS、BootStrap等技术搭建界面平台&#xff0c;后端使用Django框架处理请求&#xff0c;并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…

Jmeter和Postman哪个做接口测试会更好

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

项目实战之理解代码一(vue.config.js)

文章目录 CDN 面经天天背&#xff0c;今天总算见到真的了。 OK&#xff0c;接下来让我们走进前端优化性能方式之一&#xff1a;CDN CDN CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是用于存储和传输静态资源&#xff08;如 JavaScript、CSS…

如何为一个Type类赋值

如何为一个Type类赋值 前言案例准备一、简单赋值 前言 今天我在写代码的时候遇到一个神奇的类——Type,虽然说我们都心知肚明这个类代表着什么&#xff08;字面意思嘛&#xff0c;很好理解&#xff09;&#xff0c;但是实操起来却无从下手&#xff0c;就如何对Type类进行赋值&…

基于 golang 从零到一实现时间轮算法 (二)

Go实现单机版时间轮 上一章介绍了时间轮的相关概念&#xff0c;接下来我们会使用 golang 标准库的定时器工具 time ticker 结合环状数组的设计思路&#xff0c;实现一个单机版的单级时间轮。 首先我们先运行一下下面的源码&#xff0c;看一下如何使用。 https://github.com/x…

一招优化百度网盘下载速度,不开会员也能提高几十倍倍下载速度

​ 百度网盘&#xff08;原百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、Linux信创版、青春版、TV版、iPhone版和iPad版&#xff0c;并覆盖了主流联网车和非联网车。 用…

2023年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材&#xff0c;山东省安全员C证大纲整理…