Activiti的基本使用
目录
1、Activiti使用
1.1、数据库支持
1.2、Activiti环境
1.2.1、引入依赖
1.2.2、添加配置
1.2.3、启动项目
1.2.4、数据库表介绍
1.3、Activiti常用Service服务接口
1.4、流程设计工具
1.4.1、下载activiti-explorer
1.4.2、解压获取部署包
1.4.3、部署activiti-explorer.war
1.4.4、访问activiti-explorer
2、Activiti流程操作
2.1、流程定义
2.1.1、新建模型
2.1.2、开始节点
2.1.3、任务节点
2.1.4、结束节点
2.1.5、设置节点属性
2.1.6、保存流程定义模型
2.1.7、下载流程定义文件
2.1.8、下载流程定义图片
2.1.9、将资源文件放入项目
2.2、流程定义部署
2.2.1、单个文件部署方式
2.2.2、压缩包部署方式
2.2.3、操作数据库表
2.3、启动流程实例
2.4、查询任务
2.5、处理当前任务
2.6、查询已处理任务
2.7、其他接口(了解)
1、Activiti使用
1.1、数据库支持
入门请看:Activiti入门_Relievedz的博客-CSDN博客
Activiti 运行必须要有数据库的支持,支持的数据库有:mysql、oracle、postgres、mssql、db2、h2
1.2、Activiti环境
我们直接在当前项目:guigu-oa-parent做Activiti入门讲解
1.2.1、引入依赖
<!--引入activiti的springboot启动器 --> <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.1.0.M6</version><exclusions><exclusion><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion></exclusions> </dependency>
说明:Activiti7与SpringBoot整合后,默认集成了SpringSecurity安全框架,当前我们项目已经集成过了SpringSecurity,后续案例设置审批人时都必须是系统用户,Activiti框架会检查用户是否存在,否则会出现异常,后续大家可以在案例中测试。
1.2.2、添加配置
数据源项目已经添加,只需要如下配置即可
spring: activiti:# false:默认,数据库表不变,但是如果版本不对或者缺失表会抛出异常(生产使用)# true:表不存在,自动创建(开发使用)# create_drop: 启动时创建,关闭时删除表(测试使用)# drop_create: 启动时删除表,在创建表 (不需要手动关闭引擎)database-schema-update: true#监测历史表是否存在,activities7默认不开启历史表db-history-used: true#none:不保存任何历史数据,流程中这是最高效的#activity:只保存流程实例和流程行为#audit:除了activity,还保存全部的流程任务以及其属性,audit为history默认值#full:除了audit、还保存其他全部流程相关的细节数据,包括一些流程参数history-level: full#校验流程文件,默认校验resources下的process 文件夹的流程文件check-process-definitions: true
1.2.3、启动项目
启动项目,即可生成项目数据库表
1.2.4、数据库表介绍
Activiti 的运行支持必须要有这 25 张表的支持,主要是在业务流程运行过程中,记录参与流程的用户主体,用户组信息,以及流程的定义,流程执行时的信息,和流程的历史信息等等
1、 表的命名规则和作用
观察创建的表,我们发现 Activiti 的表都以 act_ 开头,紧接着是表示表的用途的两个字母标识,也和 Activiti 所提供的服务的 API 对应:
ACT_RE:RE 表示 repository,这个前缀的表包含了流程定义和流程静态资源 (图片、规则、等等)
ACT_RU:RU 表示 runtime,这些表运行时,会包含流程实例、任务、变量、异步任务等流程业务进行中的数据。Activiti 只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这样表就可以一直保持很小的体积,并且速度很快
ACT_HI:HI 表示 history,这些表包含一些历史数据,比如历史流程实例、变量、任务等等
ACT_GE:GE 表示 general,通用数据
2、Activiti 数据表介绍
表分类 | 表名 | 解释 |
---|---|---|
一般数据 | ||
[ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源 | |
[ACT_GE_PROPERTY] | 系统相关属性 | |
流程历史记录 | ||
[ACT_HI_ACTINST] | 历史的流程实例 | |
[ACT_HI_ATTACHMENT] | 历史的流程附件 | |
[ACT_HI_COMMENT] | 历史的说明性信息 | |
[ACT_HI_DETAIL] | 历史的流程运行中的细节信息 | |
[ACT_HI_IDENTITYLINK] | 历史的流程运行过程中用户关系 | |
[ACT_HI_PROCINST] | 历史的流程实例 | |
[ACT_HI_TASKINST] | 历史的任务实例 | |
[ACT_HI_VARINST] | 历史的流程运行中的变量信息 | |
流程定义表 | ||
[ACT_RE_DEPLOYMENT] | 部署单元信息 | |
[ACT_RE_MODEL] | 模型信息 | |
[ACT_RE_PROCDEF] | 已部署的流程定义 | |
运行实例表 | ||
[ACT_RU_EVENT_SUBSCR] | 运行时事件 | |
[ACT_RU_EXECUTION] | 运行时流程执行实例 | |
[ACT_RU_IDENTITYLINK] | 运行时用户关系信息,存储任务节点与参与者的相关信息 | |
[ACT_RU_JOB] | 运行时作业 | |
[ACT_RU_TASK] | 运行时任务 | |
[ACT_RU_VARIABLE] | 运行时变量表 |
1.3、Activiti常用Service服务接口
简单介绍一下各个 Service 的实现类:
RepositoryService
Activiti 的资源管理类,该服务负责部署流程定义,管理流程资源。在使用 Activiti 时,一开始需要先完成流程部署,即将使用建模工具设计的业务流程图通过 RepositoryService 进行部署
RuntimeService
Activiti 的流程运行管理类,用于开始一个新的流程实例,获取关于流程执行的相关信息。流程定义用于确定一个流程中的结构和各个节点间行为,而流程实例则是对应的流程定义的一个执行,可以理解为 Java 中类和对象的关系
TaskService
Activiti 的任务管理类,用于处理业务运行中的各种任务,例如查询分给用户或组的任务、创建新的任务、分配任务、确定和完成一个任务
HistoryService
Activiti 的历史管理类,可以查询历史信息。执行流程时,引擎会保存很多数据,比如流程实例启动时间、任务的参与者、完成任务的时间、每个流程实例的执行路径等等。这个服务主要通过查询功能来获得这些数据
ManagementService
Activiti 的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护
1.4、流程设计工具
IDEA版本小于等于2019,可使用Activiti插件actiBPM,大于该版本的IDEA可使用Activiti BPMN visualizer插件绘制流程设计。
今天我们主角是:Activiti Modeler
Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,开发人员可以方便在线进行流程设计,保存流程模型,部署至流程定义等等,后续我们的项目也是集成Activiti Modeler绘制流程定义。
1.4.1、下载activiti-explorer
官网下载:Get started | Activiti
1.4.2、解压获取部署包
解压activiti-5.22.0.zip,在activiti-5.22.0\wars目录下获取activiti-explorer.war
1.4.3、部署activiti-explorer.war
将activiti-explorer.war放到tomcat部署目录,启动tomcat
启动路径:双击startup.bat
1.4.4、访问activiti-explorer
http://localhost:8080/activiti-explorer
默认登录账号:kermit kermit
上面有很多功能,我们关注流程设计即可,如下图:
点击上图:流程 --> 新建模型 --> 输入模型名称(请假)--> 创建
2、Activiti流程操作
2.1、流程定义
我们定义一个请假流程
2.1.1、新建模型
2.1.2、开始节点
2.1.3、任务节点
2.1.4、结束节点
2.1.5、设置节点属性
指定标签名称:张三审批,节点任务负责人:zhangsan
指定标签名称:李四审批,节点任务负责人:lisi
2.1.6、保存流程定义模型
2.1.7、下载流程定义文件
下载文件为:qingjia.bpmn20.xml
2.1.8、下载流程定义图片
单击右键上图图片,图片另存为:qingjia.png
2.1.9、将资源文件放入项目
在service-oa模块resources下新建process资源文件夹
将qingjia.bpmn20.xml与qingjia.png放入process目录
2.2、流程定义部署
将上面在设计器中定义的流程部署到activiti数据库中,就是流程定义部署。通过调用activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,也可以将两个文件打成zip包进行部署。
2.2.1、单个文件部署方式
package com.atguigu.auth.activiti;import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;/*** @program: guigu-oa-perent* @description: 流程定义* @author: Mr.Zhang* @create: 2023-04-20 09:50**/ @SpringBootTest public class ProcessTest {//注入RepositoryService@Autowiredprivate RepositoryService repositoryService;/*** 单个文件部署方式*/@Testpublic void deployProcess() {//流程部署Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/qingjia.bpmn20.xml").addClasspathResource("process/qingjia.png").name("请假申请流程").deploy();System.out.println(deploy.getId());System.out.println(deploy.getName());} }
如果报错找不到图片在pom里面添加:
<include>**/*.png</include>
成功:
2.2.2、压缩包部署方式
/*** 压缩包部署方式*/ @Test public void deployProcessByZip() {// 定义zip输入流InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("process/qingjia.zip");ZipInputStream zipInputStream = new ZipInputStream(inputStream);// 流程部署Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).name("请假申请流程").deploy();System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName()); }
2.2.3、操作数据库表
流程定义部署后操作activiti的3张表如下:
act_re_deployment 流程定义部署表,每部署一次增加一条记录
act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray 流程资源表
2.3、启动流程实例
流程定义:将bpmn文件放到activiti的三张表中,好比是java中的一个类 流程实例:好比是java中的一个实例对象(一个流程定义可以对应多个流程实例),张三可以启动一个请假流程实例,李四也可以启动一个请假流程实例,他们互不影响
@Autowired private RuntimeService runtimeService;@Test public void startUpProcess() {//创建流程实例,我们需要知道流程定义的keyProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia");//输出实例的相关信息System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());System.out.println("流程实例id:" + processInstance.getId());System.out.println("当前活动Id:" + processInstance.getActivityId()); }
操作数据表
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
2.4、查询任务
每个节点都配置了Assignee,流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
@Autowired private TaskService taskService; /*** 查询当前个人待执行的任务*/ @Test public void findPendingTaskList() {//任务负责人String assignee = "zhangsan";List<Task> list = taskService.createTaskQuery().taskAssignee(assignee)//只查询该任务负责人的任务.list();for (Task task : list) {System.out.println("流程实例id:" + task.getProcessInstanceId());System.out.println("任务id:" + task.getId());System.out.println("任务负责人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());} }
说明:
流程实例id:一个流程只有一个,标识这个流程
任务id:流程每进行到某个节点,就会给这个节点分配一个任务id
输出结果如下:
流程实例id:d969f534-825e-11ed-95b4-7c57581a7819 任务id:d96c3f28-825e-11ed-95b4-7c57581a7819 任务负责人:zhangsan 任务名称:张三审批
2.5、处理当前任务
任务负责人查询待办任务,选择任务进行处理,完成任务。
/*** 完成任务*/ @Test public void completTask(){Task task = taskService.createTaskQuery().taskAssignee("zhangsan") //要查询的负责人.singleResult();//返回一条 //完成任务,参数:任务idtaskService.complete(task.getId()); }
完成任务后,任务自动到下一个节点
2.6、查询已处理任务
@Autowired private HistoryService historyService; /*** 查询已处理历史任务*/ @Test public void findProcessedTaskList() {//张三已处理过的历史任务List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().taskAssignee("zhangsan").finished().list();for (HistoricTaskInstance historicTaskInstance : list) {System.out.println("流程实例id:" + historicTaskInstance.getProcessInstanceId());System.out.println("任务id:" + historicTaskInstance.getId());System.out.println("任务负责人:" + historicTaskInstance.getAssignee());System.out.println("任务名称:" + historicTaskInstance.getName());} }
2.7、其他接口(了解)
/*** 查询流程定义*/ @Test public void findProcessDefinitionList(){List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery().orderByProcessDefinitionVersion().desc().list();//输出流程定义信息for (ProcessDefinition processDefinition : definitionList) {System.out.println("流程定义 id="+processDefinition.getId());System.out.println("流程定义 name="+processDefinition.getName());System.out.println("流程定义 key="+processDefinition.getKey());System.out.println("流程定义 Version="+processDefinition.getVersion());System.out.println("流程部署ID ="+processDefinition.getDeploymentId());} } /*** 删除流程定义*/ public void deleteDeployment() {//部署idString deploymentId = "82e3bc6b-81da-11ed-8e03-7c57581a7819";//删除流程定义,如果该流程定义已有流程实例启动则删除时出错repositoryService.deleteDeployment(deploymentId);//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式//repositoryService.deleteDeployment(deploymentId, true); }
Activiti的基本使用相关推荐
- Activiti——流程执行历史记录(七)
转自:http://blog.csdn.net/zjx86320/article/details/50363544 之前的几篇文章,为大家简单的介绍了部署流程定义.启动流程实例.查看和办理个人任务以及 ...
- Activiti——流程变量(六)
Activiti--流程变量 转自:http://lib.csdn.net/article/java/66665?knId=268 流程变量在整个工作流中扮演很重要的作用.例如:请假流程中有请假天数. ...
- Activiti——工作流之流程实例、任务的执行(五)
转自:http://profound-accumulation.iteye.com/blog/2244881 一.流程图 二.部署流程定义 /**部署请假流程(从zip)*/ @Test publ ...
- Activiti——数据表结构
备注: 本文转自:http://blog.csdn.net/hj7jay/article/details/51302829 转载目的在于个人学习使用,如有涉及著作权相关问题,请联系本人,本人将第一时间 ...
- Activiti——管理流程定义(四)
Activiti--管理流程定义 1.设计流程定义文档 1.1.流程图 1.2.bpmn文件 <?xml version="1.0" encoding="UTF-8 ...
- Activiti——工作流程-核心API(二)
.1 ProcessEngine 说明: 1) 在Activiti中最核心的类,其他的类都是由他而来. 2) 产生方式: 在前面看到了两种创建ProcessEngine(流程引擎)的方式(http:/ ...
- Activiti——准备开发环境(一)
准备材料下 activiti-5.17.0 1.添加Activiti5 的jar包或Maven依赖 Jar包方式 通过上述下载链接下载Activiti后,解压得到如下目录: 把libs的jar包添加到 ...
- 【应用篇】Activiti外置表单实例demo(四)
在这里我想说的外置表单.是说我们将我们自己的jsp(.form,.html)等页面上传到工作流的数据库中,当任务运行到当前结点时.给我们像前台发送绑定好的表单. 此处是给表单绑定表单的过程 不允许为: ...
- Activiti 规则任务(businessRuleTask)
Activiti 规则任务(businessRuleTask) 作者:邓家海 目前国内研究Activiti规则任务businessRuleTask)的文章在网上应该不超出3篇 小觑夜漫酒作伴,破晓黎明 ...
- activiti任务TASK
一.概要 设计TASK的表主要是:ACT_RU_TASK,ACT_HI_TASKINST(见参考-activiti表): 任务主要有:人工任务(usertask),服务任务(servicetask)等 ...
最新文章
- HDLBits 系列(11)All about Adder
- SQL Server 存储过程的分页
- 设计模式之装饰模式的学习
- Java代码简化之朗母达表达式(Lambda Express)
- cv2.error: OpenCV(4.5.2) : -1 : error: (-5:Bad argument) in function ‘rectangle‘
- PhpStorm 配置debug断点调试
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xd2 in position 85: illegal multibyte sequence
- devops_DevOps适合所有人
- MySql command line client 命令系列
- 区块链 链上脚本、智能合约和Dapp的关系区别
- 测试版ios15怎么信任软件,苹果ios15描述文件位置在哪 ios15授权信任设置方法教程...
- 喜讯|大脑营行苏引华荣获巨量引擎2023全民悦读会“悦读星推官”
- 对学习数据结构的建议
- 修改IE设置(修改注册表)允许活动内容在我的电脑的文件运行
- oracle sys.dbms job,DBMS_JOB,dbms_ijob用法
- 百分百解决 mbatis/mp报错 Invalid bound statement (not found)
- MFC实现五子棋游戏
- 21世纪25大扣将排行榜(组图)
- 【SpringBoot】51、Spring-Boot-Admin搭建服务监控系统
- Java 开发工具包
热门文章
- 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资...
- 关于HtmlCxx对,C++ 解析,编辑,重新生成HTML的
- PHP实现棱形代码(PHP练习)
- C++中的代码重用(1)
- 阿里、京东、苏宁双十一“链”战
- cpan mysql dbd_Perl中DBI、DBD::mysql模块的安装
- java集合光加_阳光沙滩-java集合:使用新建对象检查数组是否包含问题
- spring boot 集成druid数据库连接池,并打印sql
- 程序人生(创)一个新手程序员的两三事(未完待续...)
- 追赶时代浪潮的“脸商”,刷脸支付市场前景广阔