Activiti基础入门

文章目录

  • Activiti项目搭建
    • 引用依赖项
    • Activiti服务初始化
    • 数据库配置
    • 配置文件
    • 测试demo
  • Activiti功能服务
    • RepositoryService:
    • RuntimeService:
    • TaskService:
    • HistoryService:
    • ManagementService:
    • DynamicBpmnService:
  • Activiti表分类

Activiti项目搭建

引用依赖项

<activiti.version>7.0.0.Beta1</activiti.version><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>${activiti.version}</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 模型处理 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 转换 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>${activiti.version}</version></dependency><!-- bpmn json数据转换 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>${activiti.version}</version></dependency><!-- bpmn 布局 --><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-layout</artifactId><version>${activiti.version}</version></dependency><!-- activiti 云支持 --><dependency><groupId>org.activiti.cloud</groupId><artifactId>activiti-cloud-services-api</artifactId><version>${activiti.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency>

Activiti服务初始化

@Configuration
public class ActivitiConfiguration {@Autowired@Qualifier("dataSource")private BasicDataSource DataSource;@Autowiredprivate PlatformTransactionManager platformTransactionManager;/*** 注册 activiti的配置信息*/@Bean("processEngineConfiguration")public SpringProcessEngineConfiguration getProcessEngineConfiguration(){SpringProcessEngineConfiguration configuration= new SpringProcessEngineConfiguration();configuration.setDataSource(DataSource);       // 添加数据源configuration.setTransactionManager(platformTransactionManager);    // 添加事务configuration.setDatabaseSchemaUpdate("true");  // 如果有表则不创建configuration.setDbHistoryUsed(true);   // 允许查看历史信息configuration.buildProcessEngine();  //执行创建25张表,如果已经创建就不再创建了// 自动部署 bpmn文件Resource[] resources = null;try {resources= new PathMatchingResourcePatternResolver().getResources("classpath*:bpmn/*.bpmn20.xml");} catch (IOException e) {e.printStackTrace();}configuration.setDeploymentResources(resources);return configuration;}/*** 注册 ProcessEngineFactoryBean*/@Beanpublic ProcessEngineFactoryBean processEngine(){ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean();factoryBean.setProcessEngineConfiguration(getProcessEngineConfiguration());return factoryBean;}/*** 注册 RepositoryService*/@Beanpublic RepositoryService repositoryService() throws Exception{return processEngine().getObject().getRepositoryService();}/*** 注册 RuntimeService*/@Beanpublic RuntimeService runtimeService() throws Exception{return processEngine().getObject().getRuntimeService();}/*** 注册 TaskService*/@Beanpublic TaskService taskService() throws Exception{return processEngine().getObject().getTaskService();}/*** 注册 HistoryService*/@Beanpublic HistoryService historyService() throws Exception{return processEngine().getObject().getHistoryService();}
}

数据库配置

@Configuration
public class DataSourceConfiguration {@Bean("dataSource")public BasicDataSource getDruidDataSource(@Value("${spring.datasource.driver-class-name}")String driverClassName, // 数据库驱动程序@Value("${spring.datasource.url}")String url, // 数据库连接地址@Value("${spring.datasource.username}")String username, // 数据库的用户名@Value("${spring.datasource.password}")String password, // 数据库的用户名@Value("${spring.datasource.tomcat.min-idle}")int minIdle, // 最小维持连接数@Value("${spring.datasource.tomcat.max-active}")int maxActive // 最大连接数) {BasicDataSource dataSource = new BasicDataSource(); // 实例化DataSource子类对象dataSource.setDriverClassName(driverClassName); // 数据库驱动程序dataSource.setUrl(url); // 数据库的连接地址dataSource.setUsername(username); // 数据库用户名dataSource.setPassword(password); // 数据库密码dataSource.setMinIdle(minIdle); // 最小维持的连接数量dataSource.setMaxActive(maxActive); // 最大的连接数量return dataSource;}}

配置文件

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///activiti_dev?nullCatalogMeansCurrent=trueusername: rootpassword: 123456tomcat:max-active: 3min-idle: 1

测试demo

这是使用springboot项目创建的测试用例

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.persistence.entity.HistoricFormPropertyEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class BpmDemoApplicationTests {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@Autowiredprivate RepositoryService repositoryService;@Testvoid contextLoads() {}/*** @description: 创建审批* @author: gepengjun* @date: 2023/9/3 17:31* @param: []* @return: void**/@Testpublic void testCreateProcessInstance(){ProcessInstance test1 = runtimeService.startProcessInstanceByKey("test1");System.out.println("流程示例id:"+test1.getId());}/*** @description: 完成任务* @author: gepengjun* @date: 2023/9/3 17:31* @param:* @return: void**/@Testpublic void testComplete(){taskService.setVariable("37505","variable",true);taskService.complete("37505");}/*** @description: 设置流程实例变量* @author: gepengjun* @date: 2023/9/3 18:34* @param: []* @return: void**/@Testpublic void testProcessInstanceVariable(){runtimeService.setVariable("12506","taskTest","任务完成没有");}/*** @description: 获取流程实例变量* @author: gepengjun* @date: 2023/9/3 18:34* @param: []* @return: void**/@Testpublic void testGetProcessInstanceVariable(){Object taskTest = runtimeService.getVariable("30001", "taskTest");System.out.println("这是流程实例变量:"+taskTest.toString());}/*** @description: 在使用task服务获取流程实例变量* @author: gepengjun* @date: 2023/9/3 18:34* @param: []* @return: void**/@Testpublic void testTaskGetProcessInstanceVariable(){Object taskTest = taskService.getVariable("30005", "taskTest");System.out.println("使用Task服务获取流程实例变量:"+taskTest.toString());}/*** @description: 查询对应节点任务* @author: gepengjun* @date: 2023/9/3 17:31* @param: []* @return: void**/@Testpublic void testByUserName(){//根据节点名称获取指定流程实例的任务//List<Task> tasks = taskService.createTaskQuery().processInstanceId("37501").taskName("科长").list();//获取所有节点名称为“科长”的任务List<Task> tasks = taskService.createTaskQuery().taskName("高经理").list();for (Task task : tasks) {System.out.println("任务名称:"+task.getName());System.out.println("任务ID:"+task.getId());System.out.println("_______________________________");}}/*** @description: 删除流程模板* @author: gepengjun* @date: 2023/9/3 18:35* @param: []* @return: void**/@Testpublic void testRepositoryService(){repositoryService.deleteDeployment("1");}}

Activiti功能服务

RepositoryService:

RepositoryService 是 Activiti 中的一个服务接口,用于管理流程定义和部署的操作。通过 RepositoryService,可以执行以下一些常见的操作:

  1. 部署流程定义:使用 createDeployment() 方法创建一个新的部署对象,并通过 addInputStream()addClasspathResource() 等方法添加流程定义的资源文件,在最后使用 deploy() 方法将流程定义部署到引擎中进行使用。

  2. 查询流程定义:使用 createProcessDefinitionQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程定义的名称、版本号等进行查询。

  3. 获取流程定义资源:使用 getResourceAsStream() 方法可以获取流程定义的资源文件,例如获取流程图、流程定义的 XML 文件等。

  4. 删除流程定义:使用 deleteDeployment() 方法可以删除已部署的流程定义及其相关资源。

RuntimeService:

RuntimeService 是 Activiti 中的一个服务接口,用于管理流程实例的操作。通过 RuntimeService,可以执行以下一些常见的操作:

  1. 启动流程实例:使用 startProcessInstanceByKey() 方法根据流程定义的键启动一个新的流程实例,或者使用 startProcessInstanceById() 方法根据流程定义的ID启动流程实例。

  2. 查询流程实例:使用 createProcessInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程实例的ID、流程定义的Key等进行查询。

  3. 暂停和恢复流程实例:使用 suspendProcessInstanceById() 方法暂停指定ID的流程实例,使用 activateProcessInstanceById() 方法恢复暂停的流程实例。

  4. 查询任务:使用 createTaskQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、任务的负责人等进行查询。

  5. 设置和获取流程实例变量:使用 setVariable() 方法设置流程实例的变量,使用 getVariable() 方法获取流程实例的变量。

TaskService:

TaskService 是 Activiti 中的一个服务接口,用于管理任务的操作。通过 TaskService,您可以执行以下一些常见的任务相关的操作:

  1. 查询任务:使用 createTaskQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、负责人、所属流程实例等进行查询。

  2. 完成任务:使用 complete() 方法完成指定ID的任务,可以同时设置任务的执行人、变量等信息。

  3. 指派任务:使用 setAssignee() 方法将任务指派给指定的用户或组。

  4. 委派任务:使用 delegateTask() 方法将任务委派给其他人处理。

  5. 签收任务:使用 claim() 方法将任务签收,将当前用户设置为任务的负责人。

  6. 设置和获取任务变量:使用 setVariable() 方法设置任务的变量,使用 getVariable() 方法获取任务的变量。

  7. 创建附件和评论:使用 createAttachment() 方法创建任务的附件,使用 addComment() 方法添加任务的评论。

HistoryService:

HistoryService 是 Activiti 中的一个服务接口,用于管理历史数据的操作。通过 HistoryService,您可以执行以下一些常见的历史数据相关的操作:

  1. 查询历史流程实例:使用 createHistoricProcessInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据流程实例的ID、流程定义的Key等进行查询。

  2. 查询历史任务:使用 createHistoricTaskInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据任务的ID、所属流程实例、负责人等进行查询。

  3. 查询历史活动:使用 createHistoricActivityInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据活动的ID、所属流程实例、活动类型等进行查询。

  4. 查询历史变量:使用 createHistoricVariableInstanceQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据变量的名称、所属流程实例等进行查询。

  5. 查询历史表单数据:使用 createHistoricFormDataQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据表单的ID、所属流程实例等进行查询。

ManagementService:

ManagementService 是 Activiti 中的一个服务接口,用于管理引擎相关的操作。通过 ManagementService,您可以执行以下一些常见的引擎管理操作:

  1. 执行作业:使用 executeJob() 方法手动触发执行作业,例如定时任务、异步任务等。

  2. 暂停和恢复作业:使用 suspendJobById() 方法暂停指定ID的作业,使用 activateJobById() 方法恢复暂停的作业。

  3. 查询作业:使用 createJobQuery() 方法创建一个查询对象,然后可以根据不同的条件进行过滤和排序,例如根据作业的ID、作业的状态、作业的类型等进行查询。

  4. 查询引擎表:使用 getTableName() 方法获取指定实体类对应的数据库表名,使用 getTableCount() 方法获取指定表的记录数量。

  5. 强制执行数据库操作:使用 executeCommand() 方法执行自定义的数据库操作命令,例如 SQL 查询、SQL 更新等。

  6. 获取引擎配置信息:使用 getProcessEngineConfiguration() 方法获取当前引擎的配置信息,包括数据库连接信息、流程定义解析器等。

DynamicBpmnService:

DynamicBpmnService 是 Activiti 中的一个服务接口,用于动态修改流程定义和流程实例的相关内容。通过 DynamicBpmnService,您可以执行以下一些常见的动态流程操作:

  1. 动态修改流程定义:使用 changeDeploymentProcessDefinitionKey() 方法修改指定部署ID下流程定义的Key。

  2. 动态修改流程实例:使用 moveActivityIdTo() 方法将当前活动节点移动到指定的目标节点。

  3. 动态添加用户任务节点:使用 addUserTask() 方法在流程定义中动态添加用户任务节点。

  4. 动态删除节点:使用 deleteActivity() 方法删除指定节点及其关联的全部流转信息。

  5. 动态设置节点属性:使用 setActivityProperties() 方法设置指定节点的属性,如节点名称、节点描述等。

  6. 动态设置流程变量:使用 setProcessInstanceVariable() 方法设置流程实例的变量值。

Activiti表分类

在 Activiti 中,表用于存储与流程相关的数据和元数据。Activiti 从逻辑上将其分为五个类别。

  1. ACT_RE_*:包含“RE”表示 Repository,这些表存储了所有与 Activiti 流程定义和流程资源相关的数据和元数据。例如,这些表包括:

MN 流程

  • 定义的数据。
  • ACT_RE_DEPLOYMENT:保存 BPMN 文件和流程图等资源文件的数据。
  1. ACT_RU_*:包含“RU”表示 Runtime,这些表存储了流程运行期间产生的运行时数据。例如,这些表包括:

    • ACT_RU_TASK:保存当前待处理任务的数据。
    • ACT_RU_EXECUTION:保存流程实例和执行数据。
  2. ACT_ID_*:包含“ID”表示 Identity,这些表存储了用户、组和权限等身份验证相关的数据。例如,这些表包括:

    • ACT_ID_USER:保存用户的数据。
    • ACT_ID_GROUP:保存用户组的数据。
  3. ACT_HI_*:包含“HI”表示 History,这些表存储了流程实例的历史记录和统计数据。例如,这些表包括:

    • ACT_HI_PROCINST:保存流程实例的历史数据。
    • ACT_HI_TASKINST:保存任务实例的历史数据。
  4. ACT_GE_*:包含“GE”表示 Generic,这些表存储 Activiti 应用程序和一般工具使用的各种配置数据。例如,这些表包括:

    • ACT_GE_PROPERTY:保存 Activiti 数据和配置的属性数据。
      在这里插入图片描述

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

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

相关文章

基于Hugo 搭建个人博客网站

目录 1.环境搭建 2.生成博客 3.设置主题 4.将博客部署到github上 1.环境搭建 1&#xff09;安装Homebrew brew是一个在 macOS 操作系统上用于管理软件包的包管理器。类似于centos下的yum或者ubuntu下的apt&#xff0c;它允许用户通过命令行安装、更新和管理各种软件工具、…

医学案例|线性回归

一、案例介绍 某医师预研究糖尿病患者的总胆固醇和甘油三酯对空腹血糖的影响&#xff0c;某研究者调查40名糖尿病患者的总胆固醇、甘油三酯和空腹血糖的测量值如下&#xff0c;试根据上述研究问题作统计分析。 二、问题分析 本案例想要研究一些变量&#xff08;总胆固醇和甘油…

PostgreSQL问题记录:column “...“ does not exist

在PostgreSQL中&#xff0c;不论是在pgAdmin中&#xff0c;还是在命令行控制台里面&#xff0c;在SQL语句中表示属性值的总会遇到ERROR: column “…” does not exist这样的错误&#xff0c;比如下面的语句&#xff1a; 解决方案&#xff1a;将 “txt2txt” 的双引号改成单引…

PyTorch中特殊函数梯度的计算

PyTorch中特殊函数梯度的计算 普通函数 对于简单的多元函数&#xff0c;对自变量求梯度很容易&#xff0c;例如&#xff1a; f ( x , y ) x 2 y 2 f(x,y)x^2y^2 f(x,y)x2y2 则有&#xff1a; { ∇ x f ( x , y ) 2 x ∇ y f ( x , y ) 2 y \left\{ \begin{aligned} \na…

解决mq消费者消息接收成功,消费异常Cannot determine response destination

后台报错如下&#xff1a; Failed to send reply with payload [主题消息接收成功&#xff01; Message555]; nested exception is javax.jms.InvalidDestinationException: Cannot determine response destination: Request message does not contain reply-to destination, …

UDP协议结构及其注意事项

UDP报文结构 UDP报文结构主要是由两个部分组成的&#xff1a;UDP头部和数据部分。 UDP头部 源端口号&#xff1a;16位字段&#xff0c;指示数据发送方的端口号。目的端口号&#xff1a;16位字段&#xff0c;指示数据接收方端口号。UDP报文长度&#xff1a;16位字段&#xff0…

QT连接OpenCV库实现人脸识别

一、关于图像处理的相关类和函数 图像容器&#xff1a;Mat类 读取图像&#xff1a; Mat imread( const String& filename, int flags IMREAD_COLOR ); 功能&#xff1a;读取出图像 参数&#xff1a;图像路径 返回值&#xff1a;读取的图像 命名展示图像的窗口&#xff…

10 个 效果不错的值得收藏的 css 代码片段

10 个 css 代码片段 以下这 10 个常用的 css 代码片段值得收藏&#xff0c;都可以用于平常的业务代码当中。 1. 点点点加载中效果 这是一个兼容性不错的用户体验很棒的点点点加载效果&#xff0c;实现思路如下: 使用自定义的标签元素 dot。将 dot 元素设置为内联元素(displ…

房地产推广传单制作攻略,打造让人惊艳的电子传单

随着互联网的发展&#xff0c;传统的纸质传单已经逐渐被电子版传单所取代。电子版传单不仅可以节省成本&#xff0c;还可以更好地展示房产信息。在传统的设计软件中制作电子版传单需要一定的门槛&#xff0c;但是现在有了乔拓云网的后台&#xff0c;设计电子版房产H5传单变得简…

TCP机制之确认应答及超时重传

TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…

log4j日志配置

<?xml version"1.0" encoding"UTF-8"?> <!--设置log4j2的自身log级别为warn--> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status&…

无涯教程-Android - Absolute Layout函数

Absolute Layout 可让您指定其子级的确切位置(x/y坐标)&#xff0c;绝对布局的灵活性较差且难以维护。 Absolute Layout - 属性 以下是AbsoluteLayout特有的重要属性- Sr.NoAttribute & 描述1 android:id 这是唯一标识布局的ID。 2 android:layout_x 这指定视图的x坐标…

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(上)

前言 今天&#xff0c;小编我也要进入计算机网络的整个内容&#xff0c;虽然这个计算机网络的内容在考研部分中占比比较小&#xff0c;有些人不把这一部分当成重点&#xff0c;这种想法是错误的。我觉得考研的这四个内容都是非常重要的&#xff0c;我们需要进行全力以赴的对待每…

Redis:StringRedisTemplate简介

&#xff08;笔记总结自b站黑马程序员课程&#xff09; 为了在反序列化时知道对象的类型&#xff0c;JSON序列化器会将类的class类型写入json结果中&#xff0c;存入Redis&#xff0c;会带来额外的内存开销。 为了减少内存的消耗&#xff0c;我们可以采用手动序列化的方式&am…

【数据结构】堆的基础功能实现与PriorityQueue

文章目录 &#x1f340;堆的插入与删除&#x1f6eb;堆的插入&#x1f6a9;代码实现&#xff1a; &#x1f6ec;堆的删除 &#x1f38b;堆的常见习题&#x1f388;习题一&#x1f388;习题二&#x1f388;习题三 &#x1f384;PriorityQueue&#x1f431;‍&#x1f453;Priori…

2023高教社杯国赛数学建模C题思路+模型+代码(9.7晚开赛后第一时间更新)

目录 1.C题思路模型&#xff1a;9.7晚上比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 2.竞赛注意事项&#xff1a;包括比赛流程&#xff0c;任务分配&#xff0c;时间把控&#xff0c;论文润色&#xff0c;已经发布在文末名片中 3.常用国赛数学建模算法 …

添加.net core web Api 对XML数据格式的支持

默认情况下WebApi 返回的数据类型是Json格式的数据&#xff0c;XML请求的也会返回json格式&#xff0c;这显然不是我们想要的 MvcOptions.ReturnHttpNotAcceptable的默认值为false, 此时&#xff0c;如果服务器端不支持http request中Accept的格式值&#xff0c;比如applicati…

leetcode 92.反转链表II dummy节点的应用

题目 方法 dummy节点 链表的第一个结点&#xff0c;因为没有前驱结点&#xff0c;存在同时删除前驱和后继的情况&#xff0c;这时候我们需要人为构造dummy节点——人为制造出来的第一个结点的前驱结点&#xff0c;也就是说&#xff0c;在可能操作head节点时&#xff0c;我们可…

基于Matlab分析的电力系统可视化研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

4.正则提取html中的img标签的src内容

我们以百度贴吧的1吧举例 目录 1 把网页搞下来 2 收集url 3 处理url 4 空的src 5 容错 6 不使用数字作为文件名 7 并不是所有的图片都用img标签表示 8 img标签中src请求下来不一定正确 9 分页 1 把网页搞下来 搞下来之后&#xff0c;双击打开是这样的 2 收…