Java --- 云尚办公之Activiti7

news2024/11/24 19:59:43

目录

一、工作流

1.1、什么是工作流

 1.2、工作流引擎

1.3、常见工作流引擎

二、 Activiti7概述

2.1、Activiti介绍

2.2、建模语言BPMN

2.3、 Activiti使用流程

三、 Activiti使用

3.1、部署流程工具 

3.2、画出流程图并放入项目中

3.3、流程定义部署

3.4、启动流程实例

3.5、查询任务

3.6、处理当前任务与处理查询

3.7、流程实例


一、工作流

1.1、什么是工作流

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。通俗来讲,就是业务上一个完整的审批流程。**例如员工的请假,出差,外出采购,合同审核等等,这些过程,都是一个工作流。

 1.2、工作流引擎

对于工作流的处理,如果采用原始的方式,我们需要拿着各种文件到各个负责人那里去签字,需要在多个部门之间不断审批,这种方式费时费力。而我们可以借助软件系统来协助我们处理这些审批流程,这样就出现了工作流系统,使用工作流系统后可以极大的提高工作效率。

在学习工作流的过程中,我们肯定看到过这个模型:填写请假单->部门经理审批->总经理审批->人事备案。

(1)要实现上述的流程,我们自己可以通过字段标识来实现这个审批效果,在业务表中加个字段,比如填写请假单用1标识,部门经理用2标识,总经理用3标识,人事备案用4标识,好像看起来没啥问题,也实现了审批效果。可是一旦我们的流程出现了变化,这个时候我们就需要改动我们的代码了,这显然是不可取的,那么有没有专业的方式来实现工作流的管理呢?并且可以做到业务流程变化之后,我们的程序可以不用改变,如果可以实现这样的效果,那么我们的业务系统的适应能力就得到了极大提升。在这样的背景下,就出现了**工作流引擎**。

**为什么使用工作流引擎,能实现业务流程改变,不用修改代码,流程还能自动推进?**

(1)我们先来说说为什么流程改变,不用修改代码:我们的工作流引擎都实现了一个规范,这个规范要求我们的流程管理与状态字段无关,始终都是读取业务流程图的下一个节点。当业务更新的时候我们只需要更新业务流程图就行了。这就实现了业务流程改变,不用修改代码。

(2)再来说说流程自动推进,这个原理就更简单了,就拿上面的请假模型来说,工作流引擎会用一张表来记录当前处在的节点。当填写完请假单后肯定是要轮到部门经理来审批了,所以我们一旦完成了请假单填写那么这条记录将会被从这张表删除掉,并且会把下一个节点部门经理的信息插入到这张表中,当我们用部门经理的信息去这张表中查询的时候就能查出部门经理相关的审批的信息了,以此类推,这样层层递进,就实现了流程的自动递交了。

1.3、常见工作流引擎

主流的框架有:Activiti、jBPM、Camunda 、Flowable 、还有我们国产的盘古BPM、云程 

二、 Activiti7概述

2.1、Activiti介绍

 activiti是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN进行定义,业务流程按照预先定义的流程进行执行。实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作流量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

官方网站:https://www.activiti.org

2.2、建模语言BPMN

 BPM(Business Process Management)即业务流程管理,是一种规范化的构造端到端的业务流程,以持续提高组织业务效率

BPM 软件就是根据企业中业务环境的变化,推进人与人之间、人与系统之间以及系统与系统之间的整理及调整的经营方法与解决方案的 IT 工具。使用 BPM 软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,可以降低企业成本,提高利润

BPMN(Business Process Model AndNotation)即业务流程模型和符号,是一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。Activit 就是使用 BPMN 进行流程建模、流程执行管理的

BPMN2.0 是业务流程建模符号 2.0 的缩写,它由 Business Process Management Initiative 这个非营利协会创建并不断发展。BPMN2.0 是使用一些符号来明确业务流程设计流程图的一套符号规范,能增进业务建模时的沟通效率。目前 BPMN2.0 是最新的版本,它用于在 BPM 上下文中进行布局和可视化的沟通

BPMN2.0 的基本符号主要包含:

😊、事件 Event 

  开始:表示一个流程的开始

  中间:发生的开始和结束事件之间,影响处理的流程

  结束:表示该过程结束

😊、活动 Activities

  活动是工作或任务的一个通用术语。一个活动可以是一个任务,还可以是一个当前流程的子处理流程;其次,你还可以为活动指定不同的类型。常见活动如下:

  ![67177662480](assets/1671776624801.png)

😊、网关 GateWay

  用于表示流程的分支与合并,有几种常用网关需要了解:

  - 排他网关:只有一条路径会被选择

  - xxxxxxxxxx <el-button type="success" icon="el-icon-plus" size="mini" @click="add" :disabled="$hasBP('bnt.sysRole.add')  === false">添 加</el-button>vue
  
  - 包容网关:可以同时执行多条线路,也可以在网关上设置条件
  
  - 事件网关:专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态
   
😊、流向 Flow

  流是连接两个流程节点的连线,常见的流向包含以下几种:

  顺序流:用一个带实心箭头的实心线表示,用于指定活动执行的顺序
  
  信息流:用一条带箭头的虚线表示,用于描述两个独立的业务参与者(业务实体/业务角色)之间发送和接受的消息流动
  
  关联:用一根带有线箭头的点线表示,用于将相关的数据、文本和其他人工信息与流对象联系起来。用于展示活动的输入和输出

2.3、 Activiti使用流程

第一步: 引入依赖并初始化数据库

既然activiti是一个框架,那么我们肯定是需要引入对应的jar包坐标的,具体参考代码中的。

第二步:  通过工具绘画流程图

使用 activiti 流程建模工具(activity-designer)定义业务流程(.bpmn 文件) 

.bpmn 文件就是业务流程定义文件,通过 xml 定义业务流程。

第三步:流程定义部署;

向 activiti 部署业务流程定义(.bpmn 文件),使用 activiti 提供的 api 向 activiti 中部署.bpmn 文件,

通俗来讲,就是让activiti认识要使用的流程

第四步: 启动一个流程实例(ProcessInstance)

启动一个流程实例表示开始一次业务流程的运行,比如员工请假流程部署完成,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互相不影响,就好比定义一个java类,实例化两个对象一样,部署的流程就好比java类,启动一个流程实例就好比new一个java对象

第五步:用户查询待办任务(Task)

因为现在系统的业务流程已经交给 activiti 管理,通过 activiti 就可以查询当前流程执行到哪了,当前用户需要办理什么任务了,这些 activiti帮我们管理了。实际上我们学习activiti也只是学习它的API怎么使用,因为很多功能activiti都已经封装好了,我们会调用就行了

第六步:用户办理任务

用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其它用户办理,比如请假单创建后由部门经理审核,这个过程也是由 activiti 帮我们完成了,不需要我们在代码中硬编码指定下一个任务办理人了

第七步:流程结束

当任务办理完成没有下一个任务节点了,这个流程实例就完成了。

三、 Activiti使用

导入pom依赖:

<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>

修改yml文件:

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

报错异常:

 Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

解决办法:降低springboot版本

3.1、部署流程工具 

第一步:下载并解压

第二步:拷贝到将activiti的wars下的文件tomcat

第三步:启动tomcat服务

第四步:登录并访问:http://localhost:8080/activiti-explorer

登录后页面

 

  

3.2、画出流程图并放入项目中

3.3、流程定义部署

@SpringBootTest
public class ActivitiTest {
   @Autowired
   private RepositoryService repositoryService;
   //单个文件部署
    @Test
    public void activitiTest1(){
        //流程部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("process/yyds.bpmn20.xml")
                .addClasspathResource("process/1.png")
                .name("请假申请流程")
                .deploy();
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

}

 

 3.4、启动流程实例

@Autowired
    private RuntimeService runtimeService;
    //启动流程实例
    @Test
    public void activitiTest2(){
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("请假");
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动id:" + processInstance.getActivityId());

    }

3.5、查询任务

     @Autowired
     private TaskService taskService;
    @Test
    public void activitiTest3(){
        List<Task> list = taskService.createTaskQuery()
                .taskAssignee("高启强")
                .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());
        }
    }

 3.6、处理当前任务与处理查询

 @Autowired
   private HistoryService historyService;
@Test
    public void activitiTest4(){
        //查询负责人需要处理的任务
        Task task = taskService.createTaskQuery()
                .taskAssignee("高启强")
                .singleResult();
        //处理任务
        taskService.complete(task.getId());
    }
    //查询已经处理的任务
    @Test
    public void activitiTest5(){
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                .taskAssignee("高启强").list();
        for (HistoricTaskInstance historicTaskInstance:list){
            System.out.println(historicTaskInstance.getProcessInstanceId());
            
        }
    }

3.7、流程实例

  //创建流程实例指定key
    @Test
    public void activitiTest6(){
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("请假", "1314");
        System.out.println(instance.getBusinessKey());
    }
    //全部流程实例挂起
    @Test
    public void activitiTest7(){
        //获取流程定义实例
        ProcessDefinition singleResult = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("请假").singleResult();
        //调用流程定义对象的方法判断当前状态,挂起、激活
        boolean suspended = singleResult.isSuspended();
        //如果是挂起就激活,否则就挂起
        if (suspended){
            //参数1:流程定义id
            //参数2:是否激活true
            //参数3:时间点
            repositoryService.activateProcessDefinitionById(singleResult.getId(),true,null);
            log.info(singleResult.getId(),"激活了");
        }else {
            repositoryService.suspendProcessDefinitionById(singleResult.getId(),true,null);
            log.info(singleResult.getId(),"挂起了");
        }

    }

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

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

相关文章

要闻 | 自然资源部实景三维建设与城市精细化治理工程技术创新中心揭牌仪式暨第二季度工作推进会顺利召开

2023年5月16日上午&#xff0c;全国首个实景三维领域部级工程技术创新中心——自然资源部实景三维建设与城市精细化治理工程技术创新中心&#xff08;以下称“中心”&#xff09;在武汉大势智慧科技有限公司举行了揭牌仪式&#xff0c;并在大势会议室顺利召开了中心第二季度工作…

19-02 基于业务量级的架构技术选型演进

从零开始——单服务应用 单体应用技术选型 &#xff08;GitHub、Gitee…&#xff09;搜索是否有线程的产品用最熟悉的技术&#xff0c;最快的速度上线如果有经费&#xff1a;考虑商业化解决方案 个人小程序怎么做技术选型的 搜索是否有快速搭建下程序的软件技术选型 后端技…

PX4从放弃到精通(二十五):EKF2

文章目录 前言一、主程序二、update()二、predictState()三、controlFusionModes()四、controlGpsFusion五、fuseGpsVelPos()六、fuseHorizontalVelocity()七、fuseVelPosHeight()八、calculateOutputStates()前言 PX4 1.13.2 PX4 ekf的传感器数据放在FIFO的环形缓冲区中,每…

智能综合交通(水运、航空)主题汇总(附下载链接)

根据我国现行的交通运输体制&#xff0c;公路以外的交通运输称为综合交通运输形式&#xff0c;包括铁路、航空和水运等。本部分包括航空和水运运输&#xff08;铁路部分另外单独列出&#xff09;。 智慧水运、航道、港口 &#xff08;至2023年05月23日&#xff09; 湛江市综合交…

容器编排器们的自我介绍

哈喽大家好&#xff0c;我是咸鱼 咸鱼在《一文带你了解容器技术的前世今生》有介绍过容器技术的由来以及Docker项目的发展 我们知道&#xff0c;Docker 及其他容器技术能够极大地简化应用程序的部署&#xff0c;做到了”开箱即用“ 俗话说&#xff1a;”凡是具有两面性“。容…

OSPF 5种报文、状态机、邻居建立的过程

OSPF 5种报文、状态机、邻居建立的过程 一、OSPF的5种报文二、OSPF状态机三、OSPF建立的过程 一、OSPF的5种报文 Hello 用于发现邻居&#xff0c;维持邻居的状态 DD DD报文有确定设备主从&#xff0c;同步DD序列号 包含着LSA的头部信息&#xff0c;有同步LSDB数据库的作用 LSA…

云原生|Kubernetes Operator测试实例

目录 一、主要代码介绍 &#xff08;一&#xff09;变量定义&#xff1a; &#xff08;二&#xff09;测试程序入口 &#xff08;三&#xff09;before函数 &#xff08;四&#xff09;after函数 二、实际测试 &#xff08;一&#xff09;块划分 &#xff08;二&#x…

【数据分享】1997-2017 年中国市县级能耗与能效数据集

能源既关乎国家经济命脉&#xff0c;又影响人民生活水平&#xff01;能源相关的研究是各个行业的热门研究话题&#xff0c;能源相关的数据也是经常使用的数据&#xff01; 我们发现在figshare平台上分享有1997-2017 年我国市县级的能耗与能效数据&#xff0c;数据格式为Excel&…

CMake常用命令总结与练习

CMake常用命令总结 前言cmake_minimum_required (VERSION XX):CMake最低版本project (demo)&#xff1a;CMake工程名add_executable(main main.c):生成可执行文件aux_source_directory(dir var)&#xff1a;指定源文件放入变量set(val src):指定源文件放入变量include_director…

js闭包的简单应用

闭包的概念&#xff1a;有权访问其他函数的内部变量的函数 闭包是作用域运用的特殊场景。 注&#xff1a;js中自由变量的查找是在函数定义的地方向上级作用域查找&#xff0c;不是在执行的地方。 闭包的使用场景概况为两种&#xff0c;一种是函数作为参数被传递&#xff0c;一种…

面试官:MySQL自增主键一定是连续的吗?

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错的…

还在用System.out+System.currentTimeMillis打印耗时?Arthas是你不可或缺的神器!

如何分析一下自己的web项目的性能消耗&#xff0c;一般我们会在开始与结束加时间相减打印出消耗时间。这种方法侵入率太高了&#xff0c;如果想利用arthas整体调优一下自己web项目的性能点的话&#xff0c;可以使用以下的步骤或思路。&#xff08;当然xrebel也是一个不错的选择…

进程的创建和回收

一、进程概念&#xff1a;程序运行的状态 程序&#xff1a; 1.存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 2.静态的 进程&#xff1a; 1.执行一个程序所分配的资源的总称 2.动态的 进程和程序内容区别 进程包含的内容&#xff1a; BSS段&#xf…

Buffer Pool

Buffer Pool Innodb 存储引擎设计了一个缓冲池&#xff0c;来提升读写的性能。 在 MySQL 启动的时候&#xff0c;InnoDB 会为 Buffer Pool 申请一片连续的内存空间&#xff0c;然后按照默认的16KB的大小划分出一个个的页&#xff0c; Buffer Pool 中的页就叫做缓存页。此时这些…

java 社区人口管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 社区人口管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Linux安装Zookeeper、Hadoop、Hive、Hbase全家桶系列

目录 Linux安装配置Zookeeper Linux安装配置Hadoop Linux安装Hbase Linux安装配置Zookeeper 新建文件夹 mkdir /home/zookeeper 下载到指定文件夹 官网 Apache ZooKeeper wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz…

Jmeter的JSON断言

JSON断言是测试工作中经常用到的一种断言方法&#xff0c;一般用于断言某个字段值是否等于我们指定的值。所以JSON断言只能针对响应结果为applicaton/json格式的进行断言操作。 如果是其他类型&#xff08;如&#xff1a;Test、html&#xff09;&#xff0c;则无法使用这种方式…

【神经网络】tenorflow实验11--人工神经网络(2)

1. 实验目的 ①掌握梯度下降法的优化算法&#xff1b; ②能够使用tf.keras构建Sequential模型&#xff0c;完成多分类任务。 2. 实验内容 ①下载MNIST数据集&#xff0c;建立神经网络模型&#xff0c;实现对MNIST手写数字数据集的识别&#xff0c;调整超参数和训练参数&…

公网对讲SDK——对讲应用场景

anyRTC 公网对讲 SDK的发布&#xff0c;解决了开发者想做公网对讲应用但没有技术的困境&#xff1b;SDK全平台支持的特性&#xff0c;让开发者可以在任何平台接入对讲能力&#xff1b;同时因为包体积小、对业务零入侵等特性被运用到各行各业中&#xff0c;下面咱们就来聊一聊公…

ansible——利用主机模式选择主机

一&#xff1a;主机模式&#xff1a;对目标主机的一种选择方式 1.以student用户身份并使用student作为密码登录workstations ssh studentworkstation 2.创建projects-host项目文件&#xff0c;并下载ansible配置文件 lab projects-host start 3.在 workstation上更改到/home…