activiti7执行流程详解

news2024/11/28 2:45:45

什么是工作流?

官方定义:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完。

我的理解:工作流就是针对程序的业务流程进行自动化管理、执行的流。让业务的执行过程根据我们预定义好的规则不断地触发和执行。它最明显的体现就是在项目中的一些审批操作,比如说员工请假、订单审核等等类似一种的操作时业务在当前操作完成后自动的跳转进行下一操作

配置Activiti7建表

2010年5月份启动,目前使用最广泛的工作流引擎。使用activiti可以将复杂的业务流程进行抽离,业务流程按照预先定义好的规则执行。将业务流程交给activiti去管理使得当业务发生变更时不需要去大量得改动程序,降低了维护成本。

activiti使用专门的建模语言BPMN进行定义,BPMN就是一组定义好的符号语言,使用这些符号来模拟整个复杂业务的执行流程

activiti的配置文件:实际上也是利用spring来配置的xml文件,其中主要配置的就是一个数据源以及注册引擎配置类Bean实例,通过流程引擎配置类ProcefssEngineConfiguration,我这里使用的是druid连接池,然后将连接池引入到ProcefssEngineConfiguration中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  <!--数据源配置druid -->
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    <property name="url"
              value="jdbc:mysql://localhost:3306/activiti?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
  </bean>
  <!--activiti单独运行的ProcessEngine配置对象(processEngineConfiguration),使用单独启动方式 默认情况下:bean的id=processEngineConfiguration -->
<!--默认创建时  该id名必须不可变 processEngineConfiguration-->
  <bean id="processEngineConfiguration"
 class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <!--代表数据源 -->
    <property name="dataSource" ref="dataSource"></property>
    <!--代表是否生成表结构 -->
    <property name="databaseSchemaUpdate" value="true" />
  </bean>
</beans>

第一次使用activiti需要去生成如下25张数据表,我们只需要通过获取ProcessEngine就可以自动创建

public void test01(){
  // 创建activiti表  后期有ProcessEngine帮助我们管理  
  // 默认创建方式
  ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  System.out.println(processEngine);
  // 自定义创建方式
  ProcessEngineConfiguration processEngineConfigurationFromResource =
                ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("自定义文件名","自定义bean名");
}

自定义创建方式,更加灵活。activiti的配置文件命名以及processEngineConfiguration的id命名都可以自定义

databaseSchemaUpdate是指activiti的表生成策略,true标识如果数据库中已经存在则直接使用,如果不存在则先创建再使用

activiti核心组件PageEngine

activiti的核心就是ProcessEngine,就是工作流引擎。那么通过ProcessEngine可以调用不同的service接口,这些接口都封装了操作activiti生成表的方法,可以对于activiti生成的25张数据表进行不同的操作,如下:

在这里插入图片描述

像repositoryService就是用于部署流程服务,Runtime就是运行时服务,每个Service都对应有自己的数据表。我们在调用每个服务实例的方法实际上都是在操作数据库中的activiti生成的表。

activiti流程体验

activiti的使用步骤:
1、定义流程:按照BPMN使用流程定义符号对整个流程进行抽象建模
2、部署流程:将构建好的BPMN文件加载到数据库中生成表数据
3、启动流程:使用Java程序操作数据库表内容

下面我们用员工的请假审批流程做演示

1、对流程进行抽象建模在这里插入图片描述

每个步骤都有自己对应的操作,以及对应的负责人。

2、流程任务部署

// 流程任务部署
@Test
public void deploymentTest(){
  // (1)创建流程引擎 加载配置文件 默认加载activiti.cfg.xml文件
  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  // (2)获取repositoryService
  RepositoryService repositoryService = engine.getRepositoryService();
  // (3)通过repositoryService创建部署流程
  Deployment deploy = repositoryService.createDeployment()
    // (4) 添加资源文件
    .addClasspathResource("bpmn/test.bpmn20.xml")
    .addClasspathResource("bpmn/diagram.png")
    .name("员工请假审批流程")
    // (5)部署
    .deploy();
  // 查看当前流程的id、名称
  System.out.println("申请流程实例ID="+deploy.getId());
  System.out.println("申请流程示例名称="+deploy.getName());
}

下面启动一项任务流程实例,即对应项目中有员工申请了请假操作时的流程

// 启动流程实例
@Test
public void testProcess(){
  // 1. 创建ProcessEngine
  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  // 2. 获取RunTimeService运行时服务
  RuntimeService service = engine.getRuntimeService();
  // 3. 根据流程定义的id启动流程  我这里时test
  ProcessInstance instance = service.startProcessInstanceByKey("test");
  // 输出内容
  System.out.println("流程定义ID="+instance.getProcessDefinitionId());
  System.out.println("流程实例ID="+instance.getId());
  System.out.println("当前活动ID="+instance.getActivityId());
}

在项目开发中,如果某一用户或者是员工想要请假,那么就会为其启动一项任务流程。启动一项任务流程之后,activiti就会在对应的运行服务表中做出一些记录。启动流程之后也就对应着我们的BPMN图走到了第二步:经理审批

那么这个时候我们通过经理这个角色就可以查询到此时经理需要处理的任务流程,如下:查询个人待处理业务

// 查询个人待执行的任务
@Test
public void testGetPersonalTaskList(){
// 1. 获取引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2. 获取TaskService
TaskService taskService = engine.getTaskService();
// 3. 根据条件查询  以及任务负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("forLeave")  // 任务
.taskAssignee("zhangsan")   // 负责人
.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());
}
}

上述程序只是查询到了某一角色的待完成任务:部门主管审批,下面是具体操作来使该角色完成任务,同样是使用流程引擎获取TaskService

@Test
public void complete(){
  // 获取流程引擎
  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  // 获取任务TaskService
  TaskService taskService = engine.getTaskService();
  // 根据任务id完成任务  将上述查询道道的待完成任务id传入
  taskService.complete("2504");
}

该角色任务完成后将会跳转至下一步骤:部门经理审批。可以通过act_ru_task查看,该表就是对应某一项任务的执行状态,每一步的负责人通过之后就会跳转至下一项。同样的也可以通过act_hi_taskinst该表来查看某一项任务的执行进度,在对应的数据后会有该步骤的开始时间,如果已完成则会有完成结束时间

那么在实际项目中,我们可以首先通过获取某个角色的待完成任务放在页面上,该角色如果审批通过,那么可以将它点击通过的任务id作为形参传入上述complete方法中,以此完成该角色审批任务

下面执行部门经理审批,完成所有步骤

// 继续完成部门经理审批
@Test
public void completeTask(){
  // 获取流程引擎
  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  // 获取任务TaskService
  TaskService taskService = engine.getTaskService();
  // 查询部门经理lisi待完成得请假审批任务  并获取该任务对象
  Task task = taskService.createTaskQuery()
    .processDefinitionKey("forLeave")
    .taskAssignee("lisi")
// 获取单个任务  如果有多个任务则要用list();
    .singleResult();
  // 让李四完成任务 根据任务id完成任务  将上述查询到的待完成任务id传入
  taskService.complete(task.getId());
}

processDefinitionKey当中得key也就是参数就是需要查询得任务流程的id,就是构建BPMN点击空白界面时出现的id。完成所有任务后再次查看act_ru_task运行任务表会发现刚刚执行任务流程已经被删除,这是因为任务已经结束。

我们可以查看act_hi_actinst历史任务实例表,会发现该表中拥有本次任务流程的全部步骤以及详细信息
在这里插入图片描述
可以看到各个步骤开始及完成的时间以及负责人等详细信息

zip方式批量部署流程任务

// zip批量部署任务
@Test
public void deployPrecessZip(){
  // 获取流程引擎
  ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  // 获取部署repositoryService
  RepositoryService service = engine.getRepositoryService();
  // 批量部署流程
  // 先读取文件
  InputStream inputStream = this.getClass()
    .getClassLoader()
    .getResourceAsStream("bpmn/bpmn.zip");
  // 将文件转换为zip流
  ZipInputStream zipInputStream = new ZipInputStream(inputStream);
  // 将zip流形式的文件交给service去读
  Deployment deploy = service.createDeployment()
    .addZipInputStream(zipInputStream)
    .deploy();
  System.out.println("部署的任务流程名称=="+deploy.getName());
  System.out.println("部署的任务流程ID=="+deploy.getId());
}

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

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

相关文章

阿赵的MaxScript学习笔记分享八《文件操作》

大家好&#xff0c;我是阿赵。继续分享MaxScript学习笔记第八篇 。这一篇主要讲文件操作&#xff0c;包括文件的I/O和导入导出。 1、获得3DsMax指定的一些目录路径 如果在电脑上安装了3DsMax软件&#xff0c;那么在文档里面会有一个3dsMax的文件夹&#xff0c;里面有一些3dsMa…

《C++ Primer Plus》(第6版)第8章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第8章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第8章编程练习1. 打印字符串2. CandyBar3. 将string对象的内容转换为大写4. 设置并打印字符串5. max5()6. maxn()7. SumArray()《C Primer Plus》&#xff08;第6版…

【C++】C++11 异常

目录 1. C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1. 异常的抛出和捕获 3.2. 在函数调用链中异常栈展开匹配原则 3.3. 异常的重新抛出 3.4. 异常安全 3.5. 异常规范 4.自定义异常体系 5. C标准库的异常体系 6. 异常的优缺点 6.1. C异常的优点&…

Spark性能优化二 Shuffle机制分析

&#xff08;一&#xff09; 什么情况下发生shuffle 在MapReduce框架中&#xff0c;Shuffle是连接Map和Reduce之间的桥梁&#xff0c;Map阶段通过shuffle读取数据并输出到对应的Reduce&#xff1b;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中&#xff0c…

Linux 学习整理(使用 iftop 查看网络带宽使用情况 《端口显示》)

一、命令简介 iftop 是实时流量监控工具&#xff0c;可以用来监控网卡的实时流量&#xff08;可以指定网段&#xff09;、反向解析IP、显示端口信息等。 二、命令安装 yum install -y iftop 三、命令相关参数及说明 3.1、相关参数说明 -i&#xff1a;设定监测的网卡&#…

python未来应用前景怎么样

Python近段时间一直涨势迅猛&#xff0c;在各大编程排行榜中崭露头角&#xff0c;得益于它多功能性和简单易上手的特性&#xff0c;让它可以在很多不同的工作中发挥重大作用。 正因如此&#xff0c;目前几乎所有大中型互联网企业都在使用 Python 完成各种各样的工作&#xff0…

CAD中如何将图形对象转换为三维实体?

有些小伙伴在CAD绘制完图纸后&#xff0c;想要将图纸中的某些图形对象转换成三维实体&#xff0c;但却不知道该如何操作&#xff0c;其实很简单&#xff0c;本节CAD绘图教程就和小编一起来了解一下浩辰CAD软件中将符合条件的对象转换为三维实体的相关操作步骤吧&#xff01; 将…

HID协议详解 - Report Descriptor报告描述符构建与解析

USB相关基础知识简述 报告描述符是HID协议里比较复杂的一部分&#xff0c;在理解报告描述符之前&#xff0c;可以对USB协议数据传输的一些基础知识做一些了解&#xff0c;更方便理解后续内容。 报告是USB协议里数据传输&#xff08;Data Transfer&#xff09;的一种&#xff…

Android正确使用资源res文件

观看此文注意首先有的UI改颜色&#xff0c;没用&#xff0c;发现无法更改按钮背景颜色。我的AS下载的是最新版本&#xff0c;Button按钮的背景颜色一直都是亮紫色&#xff0c;无法更改。为什么呢&#xff1f;首先在你的清单文件中看你应用的是哪个主题。我现在用的是这个可能你…

PYthon组合数据类型的简单使用

Python的数据类型有两种&#xff0c;基本数据类型和组合数据类型&#xff0c;组合数据类型在Python的使用中特别重要。 1.组合数据类型的分类&#xff1a; 2.序列类型 序列类型中元素存在顺序关系&#xff0c;可以存在数值相同但位置不同的元素。序列类型支持成员关系操作符&…

计算机编程基础

0与1的世界 计算机是由晶体管和电路板组成的电子设备。 不论是我们微信信息的呈现、图像的储存和数字之间的运算本质上都是0和1的信息。 0、1便可以代表电压的高低、开关的闭合以及电阻的导电和不导电。 0、1表示的数字便是“逢二进一”。计算机的最小的储存单位是位&#…

Java如何String字符串带括号转成List

问题现象 今天在做一个需求&#xff1a;将存入数据库中的数据读到后解析成list遍历分析 数据格式&#xff1a; "[1677660600000, 1677660900000, 1677661200000]" "[5, 4, 4,3,2&#xff0c;0,0]" 我一开始想到的就是使用逗号分割即可 结果变成了这样的…

电容笔和Apple pencil有什么区别?开学季电容笔排行榜

与苹果的 Pencil相比&#xff0c;市面上常见的电容笔在压感上是没有具备重力压感&#xff0c;只具备着一种倾斜压感。对于绘画没有过高要求的话&#xff0c;其实一支普通的平替电容笔&#xff0c;就能为我们解决日常很多问题。它不仅可以用在办公上&#xff0c;也可以用在笔记、…

算法小抄3-理解使用Python容器之列表

引言 首先说一个概念哈,程序算法数据结构,算法是条件语句与循环语句组成的逻辑结构,而数据结构也就是容器. 算法决定数据该如何处理,而容器则决定如何数据如何存储. 不同的语言对容器有不同的实现方式, 但他们的功能都是相似的, 打好容器基础,你就可以在各式各样的语言中来回横…

1.Spring Cloud (Hoxton.SR10) 学习笔记—基础知识

本文目录如下&#xff1a;一、Spring Cloud基础知识什么是微服务架构&#xff1f;服务拆分 有哪些注意事项&#xff1f;什么是分布式集群?分布式的 CAP 原则&#xff1f;组件 - Spring Cloud 哪几个组件比较重要&#xff1f;组件 - 为什么要使用这些组件&#xff1f;组件 - Na…

有关白盒加密

白盒密码技术白皮书 有关白盒的概念 其实白盒黑盒之类概念其实是软件保护方面的概念&#xff0c;在很多方面都有应用&#xff0c;例如 黑盒&#xff1a; 传统的加密技术是默认假定处于黑盒中的&#xff0c;也就是假定攻击者无法获得密钥。具体而言&#xff0c;认为攻击者并…

PMP证书含金量如何,打算以后从事项目管理这一行业的有没有必要考这个证书?

建议考一个&#xff0c;虽然说这一纸证书实际不能带来多少利益&#xff0c;只是一个资格证书&#xff0c;项目管理行业入门证书&#xff0c;但是现在很多企业招聘要求中写了“有 PMP 证书”优先录取&#xff0c;还是考一个有备无患。含金量问题一直备受关注&#xff0c;总结了一…

操作系统(1.1)--引论

目录 一、操作系统的目标和作用 1.操作系统的目标 2.操作系统的作用 2.1 OS作为用户与计算机硬件系统之间的接口 2.2 OS作为计算机系统资源的管理者 2.3 0S实现了对计算机资源的抽象 3. 推动操作系统发展的主要动力 二、操作系统的发展过程 1.无操作系统的计算机系统…

Web3中文|日本元宇宙经济“狂飙”

2月27日&#xff0c;三菱、富士通和其它科技公司发布关于建立“日本元宇宙经济区”的协议&#xff0c;表示将联手从角色扮演游戏的角度创建开放的元宇宙基础设施&#xff0c;以推动日本的Web3战略。据了解&#xff0c;日本一直在努力将Web3技术纳入其国家议程&#xff0c;去年1…

规范哈夫曼编码和Deflate算法

经过常规的哈夫曼编码以后&#xff0c;我们需要将每个符号对应的码字记录下来&#xff0c;比较容易想到的是按照字母序记录每个字母的编码&#xff0c;这样的好处是字母与码字的映射关系被隐式记录&#xff1a; 假设字母表 A{a1,a2,a3,a4,a5}\mathcal{A}\{a_1,a_2,a_3,a_4,a_5\…