Activiti流程文件部署过程解析

 更新时间:2020年03月09日 11:24:27   作者:程序晓猿  
这篇文章主要介绍了Activiti流程文件部署过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

用bpmn规范定义好一个流程得到流程定义文件后,需要把该文件部署到activiti的数据库后,这个流程才可以使用。

activiti中和流程定义相关的操作都需要使用RepositoryService这个服务组件来进行。

activiti中所有的服务组件都需要通过流程引擎对象来获取

一、RepositoryService服务组件

这个组件中提供了一系列管理流程定义和流程部署的api,我们可以使用这个组件中的api来部署流程

1.1 RepositoryService实例对象的获取

使用流程引擎对象的实例方法processEngine.getRepositoryService();来获取RepositoryService

  @Test
  public void test1() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    System.out.println(repositoryService);
  }

二、流程部署信息的描述,Deployment对象

在讲解如何部署流程前,我们先了解下activiti如何描述流程的部署信息。activiti用Deployment这个接口来描述流程的部署信息,并自己提供了实现类。对应activiti数据库中的一张表ACT_RE_DEPLOYMENT

三、流程的部署

activiti使用DeploymentBuilder这个类的对象来部署流程,从这个类的名字就可以看出它的功能,部署一个流程并返回描述这次部署信息的对象。

使用RepositoryService服务组件的对象来获取DeploymentBuilder对象

DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();

然后给这个deploymentBuilder添加要部署的流程文件的位置

deploymentBuilder.addClasspathResource("process/process.bpmn");

我这里是在resources目录下创建了process/process.bpmn流程定义文件,所以添加了这个路径

还可以为本次部署添加名称和分类

deploymentBuilder.name("vacation-test").category("test");

最后执行部署

Deployment deploy = deploymentBuilder.deploy();

观察数据库ACT_RE_DEPLOYMENT表,会发现多了一条部署记录。

完整的代码为

  @Test
  public void test1() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
    deploymentBuilder.addClasspathResource("process/process.bpmn");
    deploymentBuilder.name("vacation-test").category("test");
    Deployment deploy = deploymentBuilder.deploy();
    System.out.println(deploy);
  }

注意,默认情况下多次部署同一流程图在表中会产生多条记录,用部署时间字段用来做区分

3.1 过滤重复部署的问题

为了防止资源没有发生变化而再次执行部署方法产生的重复部署,可以调用DeploymentBuilder的enableDuplicateFiltering()方法,这里的过滤方式是先查询部署表,得到表中已有的部署对象集合,如果发现有一条部署记录与将要部署的对象相同,就不会重复部署。所以部署时设置的name,category,资源名称和内容,只要有一个不一样就不会被过滤掉

deploymentBuilder.enableDuplicateFiltering();//设置过滤重复部署

四、部署信息的管理

activiti在DeploymentQuery这个接口中封装了管理部署信息的api,并自己提供了实现类,通过repositoryService服务组件来获取其实现类对象。

DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();

4.1 查询部署信息

@Test
  public void test2() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
    //根据deploymentId查询
    String deploymentId="4201";
    Deployment singleResult = deploymentQuery.deploymentId(deploymentId)
        .deploymentName("vacation-test").singleResult();
    System.out.println(singleResult);
  }

查询时,先给deploymentQuery对象拼接查询条件,这里支持链式编程,先一个个的拼接查询条件,最后这个

singleResult()方法执行查询,返回一个结果;如果根据设定的条件返回多个结果,调用singleResult()就会抛出异常,这时需要调用返回多个结果的查询方法list()

4.2 删除部署信息

因为部署信息表与其他表有外键关联,所以直接删除部署表中的数据是删不掉的,需要调用RepositoryService中的删除方法来删除

  @Test
  public void test3() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    String deploymentId="4201";
    boolean cascade=true;
    repositoryService.deleteDeployment(deploymentId, cascade);
  }

其中第2个参数cascade表示是否级联删除其他表的数据,直接给true就可以

五、流程定义及其管理

5.1 流程定义信息的描述

一个流程文件部署成功后,不仅会在部署表中记录部署信息,同时也会在流程定义表act_re_procdef中添加一条流程定义信息,描述被部署的流程文件所定义的流程。

注意其中的这个KEY_字段对应的就是流程定义文件中的process节点的id,activiti开启流程时要使用这个字段。

<process id="process" isExecutable="true">
  <startEvent id="sid-26F630F1-0761-4247-8383-F63F913A310E"></startEvent>
  <userTask id="usertask1" name="apply vecation" activiti:assignee="kermit"></userTask>
  <sequenceFlow id="sid-85398367-B674-473A-B7AC-268635F0DF5D" sourceRef="sid-26F630F1-0761-4247-8383-F63F913A310E" targetRef="usertask1"></sequenceFlow>
  <userTask id="usertask2" name="manager agree" activiti:assignee="kermit"></userTask>
  <sequenceFlow id="sid-5372C6B1-7359-40AB-B0A4-3FF06F20790E" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
  <endEvent id="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></endEvent>
  <sequenceFlow id="sid-BCF9087D-36F4-4EDE-BD88-013AC74AB93A" sourceRef="usertask2" targetRef="sid-F621C8EF-13A5-4A49-BD5B-708BFB066576"></sequenceFlow>
 </process>

和部署信息一样,activiti也有一个接口来描述这张表的信息,ProcessDefinition,并自己提供了实现类

5.2 流程定义信息的管理

activiti提供了ProcessDefinitionQuery这个接口,在其中封装了流程定义信息查询相关的api。查询对象的获取和使用与DeploymentQuery类似。

  @Test
  public void test1() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    String processDefinitionKey="process";
    List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey(processDefinitionKey).list();
    for (ProcessDefinition processDefinition : list) {
      System.out.println(processDefinition);
    }
  }

六、总结

本文介绍了如何部署流程定义文件,以及对部署后生成的部署信息和流程定义信息的管理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java开启线程的四种方法案例详解

    Java开启线程的四种方法案例详解

    这篇文章主要介绍了Java开启线程的四种方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Java文件操作之序列化与对象处理流详解

    Java文件操作之序列化与对象处理流详解

    这篇文章主要为大家详细介绍了Java文件操作中的序列化与对象处理流,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • 基于Springboot实现定时发送邮件功能

    基于Springboot实现定时发送邮件功能

    这篇文章主要为大家详细介绍了基于Springboot实现定时发送邮件功能的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • HashMap底层原理全面详解面试绝对不慌

    HashMap底层原理全面详解面试绝对不慌

    这篇文章主要介绍了HashMap底层实现原理详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Spring Cloud 覆写远端的配置属性实例详解

    Spring Cloud 覆写远端的配置属性实例详解

    这篇文章主要介绍了Spring Cloud 覆写远端的配置属性的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java对象转Json,关于@JSONField对象字段重命名和顺序问题

    Java对象转Json,关于@JSONField对象字段重命名和顺序问题

    这篇文章主要介绍了Java对象转Json,关于@JSONField对象字段重命名和顺序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 深入浅出RocketMQ的事务消息

    深入浅出RocketMQ的事务消息

    RocketMQ事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。本文主要介绍了RocketMQ事务消息的相关知识,需要的可以参考一下
    2023-04-04
  • Java基础之集合Set详解

    Java基础之集合Set详解

    这篇文章主要介绍了Java基础之集合Set详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java中List转Map List实现的几种姿势

    Java中List转Map List实现的几种姿势

    本文主要介绍了Java中List转Map List实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java中Minio的基本使用详解

    Java中Minio的基本使用详解

    这篇文章主要介绍了Java中Minio的基本使用详解,MinIO 是一个基于Apache License v2.0开源协议的对象存储服务,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,需要的朋友可以参考下
    2024-01-01

最新评论