项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍。介绍了工作流Activiti框架中业务流程部署的两种方式,包括编程式部署以及通过Activiti Explorer控制台部署。介绍了流程部署时需要使用到的外部资源,流程定义部署不同的版本生成不同的流程定义的图片。通过这篇文章,基本上对工作流Activiti框架中流程定义的部署就可以很熟练了。

业务文档

  • 为了部署流程,需要包装在一个业务文档中

    • 一个业务文档是Activiti引擎部署的单元
    • 一个业务文档相当与一个压缩文件,它包含:

      • BPMN2.0流程
      • 任务表单
      • 规则
      • 其他任意类型的文件
    • 业务文档是包含命名资源的容器
  • 当一个业务文档被部署,它将会自动扫描以.bpmn20.xml或者.bpmn作为扩展名的BPMN文件.每个那样的文件都将会被解析并且可能会包含多个流程定义
业务归档中的Java类将不能够添加到类路径下
为了能够让流程运行,必须把存在于业务归档程中的流程定义使用的所有自定义的类(例如:Java服务任务或者实现事件的监听器)放在 [activiti引擎的类路径] 下

编程式部署

  • 通过一个压缩文件(支持Zip和Bar)部署业务文档
  • 也可以通过一个独立资源(例如bpmn,xml等)构建部署
String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));

repositoryService.createDeployment()
    .name("process-one.bar")
    .addZipInputStream(inputStream)
    .deploy();

通过Activiti Explorer控制台部署

  • Activiti web控制台允许你通过web界面的用户接口上传一个bar格式的压缩文件(或者一个bpmn20.xml格式的文件).选择Management 标签和点击Deployment:

在这里插入图片描述

外部资源

  • 流程定义保存在Activiti所支持的数据库中
  • 当使用服务任务,执行监听器
  • 从Activiti配置文件中配置的Spring beans时,流程定义能够引用这些委托类.
  • 这些类或者Spring配置文件对于所有流程引擎中可能执行的流程定义必须是可用的

Java类

  • 当流程实例被启动的时候,在流程中被使用的所有自定义类应该存在流程引擎的类路径下:

    • 服务任务中:

      • JavaDelegates
      • 事件监听器
      • 任务监听器
    • 在部署业务文档时,这些类不必都存在于类路径下.当使用Ant部署一个新的业务文档时,意味着你的委托类不必存在类路径下
  • 当使用示例设置添加自定义类:

    • 应该添加包含自定义类的jar包到activiti-explorer控制台
    • activiti-restwebapp lib文件夹中
    • 不要忽略包含你自定义类的依赖关系
    • 还可以将你自定义的依赖添加到你的Tomcat容器的安装目录中的${tomcat.home}/lib

流程中使用Spring beans

  • 当表达式或者脚本使用Spring beans时,这些beans对于引擎执行流程定义时必须是可用的
  • 如果要构建自定义的web应用并且按照Spring集成在应用上下文配置流程引擎.要记住,如果在使用Activiti rest web应用,那么也应该更新Activiti rest web应用的上下文.可以把在activiti-rest/lib/activiti-cfg.jar文件中的activiti.cfg.xml替换成的Spring上下文配置的activiti-context.xml文件

创建独立应用

  • 可以将Activiti rest web应用加入到web应用之中,只需要配置一个 ProcessEngine,
  • 从而不用确保所有的流程引擎的所有委托类在类路径下面并且是否使用正确的spring配置

流程定义的版本

  • BPMN中并没有版本的概念,而在Activiti中,流程定义的版本会在部署时创建,在部署的时候,流程定义被存储到Activiti使用的数据库之前,Activiti将会自动给流程定义分配一个版本号
  • 业务文档中每一个的流程定义,都会通过下列部署执行初始化属性key,version,nameid:

    • XML文件中流程定义(流程模型)的id属性被当做是流程定义的key属性
    • XML文件中的流程模型的name属性被当做是流程定义的name 属性.如果该name属性没有指定,那么id属性被当作是name属性
    • 带有特定key的流程定义在第一次部署的时候,将会自动分配版本号为1,对于之后部署相同key的流程定义时候,这次部署的版本号将会设置为比当前最大的版本号大1的值.该key属性被用来区别不同的流程定义
    • 流程定义中的id属性被设置为 {processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 这里的generated-id是一个唯一的数字被添加, 用于确保在集群环境中缓存的流程定义的唯一性
<definitions id="myDefinitions" >
  <process id="myProcess" name="My important process" >
    ...

当部署了这个流程定义之后,数据库中的流程定义如下:

id key name version
myProcess:1:676 myProcess My important process 1
  • 假设部署用一个流程的最新版本号(改变用户任务),但是流程定义的id保持不变.流程定义表将包含以下列表信息:
id key name version
myProcess:1:676 myProcess My important process 1
myProcess:2:870 myProcess My important process 2

runtimeService.startProcessInstanceByKey("myProcess") 方法被调用时,它将会使用流程定义版本号为2的, 因为这是最新版本的流程定义.可以说每次流程定义创建流程实例时,都会默认使用最新版本的流程定义

  • 创建第二个流程,在Activiti中,定义并且部署它,该流程定义会添加到流程定义表中:
<definitions id="myNewDefinitions" >
  <process id="myNewProcess" name="My important process" >
    ...
  • 表结构如下所示:
id key name version
myProcess:1:676 myProcess My important process 1
myProcess:2:870 myProcess My important process 2
myNewProcess:1:1033 myNewProcess My important process 1
  • 注意: 新流程的key与我们的第一个流程是不同的,尽管流程定义的名称name是相同的(当然,名称name也可以是不相同的),Activiti仅仅只考虑id属性判断流程. 因此,新的流程定义部署的版本号为1

提供流程图片

  • 流程定义的流程图可以被添加到部署中,该流程图将会持久化到Activiti所使用的数据库中并且可以通过Activiti的API进行访问.
  • 流程图也可以被用来在Activiti Explorer控制台中的流程中进行显示
  • 如果在我们的类路径下面有一个流程:org/activiti/expenseProcess.bpmn20.xml, 该流程定义有一个流程key=expense. 以下遵循流程定义图片的命名规范(按照这个特定顺序):

    • 如果在部署时一个图片资源已经存在,是BPMN2.0的XML文件名,后面是流程定义的key并且是一个图片的后缀.那么该图片将被使用.

      • 应该是org/activiti/expenseProcess.expense.png(或者jpg/gif).如果在一个BPMN2.0 XML文件中定义多个流程定义图片,这种方式更有意义.每个流程定义图片的文件名中都将会有一个流程定义key
    • 如果并没有这样的图片存在,部署的时候寻找与匹配BPMN2.0 XML文件的名称的图片资源

      • 应该是org/activiti/expenseProcess.png.注意:这意味着在同一个BPMN2.0 XML文件夹中的每个流程定义都会有相同的流程定义图片.因此,在每一个BPMN 2.0 XML文件夹中仅仅只有一个流程定义,这绝对是不会有问题的
  • 使用编程式的部署方式:
repositoryService.createDeployment()
  .name("expense-process.bar")
  .addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")
  .addClasspathResource("org/activiti/expenseProcess.png")
  .deploy();
  • 接下来,可以通过API来获取流程定义图片资源:
 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                                                         .processDefinitionKey("expense")
                                                         .singleResult();

  String diagramResourceName = processDefinition.getDiagramResourceName();
  InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);

自动生成流程图片

  • 在部署的情况下没有提供图片,如果流程定义中包含必要的'图像交换'信息时,Activiti流程引擎会自动生成一个图像
  • 该资源可以按照上面部署时提供流程图片完全相同的方式获取:

在这里插入图片描述

  • 如果因为某种原因,在部署的时候,并不需要或者不必要生成流程定义图片,那么就需要在流程引擎配置的属性中使用isCreateDiagramOnDeploy进行配置就可以不生成流程定义图片:
<property name="createDiagramOnDeploy" value="false" />

类别

  • 部署和流程定义都是用户定义的类别
  • 流程定义类别在BPMN文件中属性的初始化的值:
<definitions ... targetNamespace="yourCategory" ... />
  • 部署类别是可以直接使用API进行指定:
repositoryService
    .createDeployment()
    .category("yourCategory")
    ...
    .deploy();
相关文章
|
2月前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
342 11
|
11天前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
105 17
Spring Boot 两种部署到服务器的方式
|
3天前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
38 18
|
24天前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
44 10
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
2月前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
3月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
70 12
|
2月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
45 6
|
2月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
72 5
|
2月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
54 5

推荐镜像

更多