Spring中部署Activiti流程定义的三种姿势
摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍。
本文分享自华为云社区《项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势》,作者:攻城狮Chova 。
业务文档
- 为了部署流程,需要包装在一个业务文档中
- 一个业务文档是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-rest的webapp 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,name和id:
- 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保持不变.流程定义表将包含以下列表信息:

当runtimeService.startProcessInstanceByKey(“myProcess”) 方法被调用时,它将会使用流程定义版本号为2的, 因为这是最新版本的流程定义.可以说每次流程定义创建流程实例时,都会默认使用最新版本的流程定义
- 创建第二个流程,在Activiti中,定义并且部署它,该流程定义会添加到流程定义表中:
<definitions id="myNewDefinitions" >
<process id="myNewProcess" name="My important process" >
...
- 表结构如下所示:

- 注意: 新流程的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();
Spring中部署Activiti流程定义的三种姿势的更多相关文章
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- Spring的依赖注入(DI)三种方式
Spring依赖注入(DI)的三种方式,分别为: 1. 接口注入 2. Setter方法注入 3. 构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个 ...
- 将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种方式
Tomcat作为Servlet/JSP容器(服务器)挺不错的,开源免费,需要知道的是Tomcat是一个Web服务器,其符合Servlet/JSP规范,但是却没有实现所有JavaEE规范,所以我们还是应 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- Spring如何使用JdbcTemplate调用存储过程的三种情况
注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...
- Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式: a. 加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- 转 Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式: 方式一:加载classpath目录下的vm文件 Prope ...
- 在网页中JS函数自动执行常用三种方法
在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT LANGUAGE="JavaScript"> function ...
- Activiti进阶(二)——部署流程资源的三种方式
转自:http://blog.csdn.net/zjx86320/article/details/50234707 流程资源可以是各种类型的文件,在启动流程或流程实例运行过程中会被读取.下面介绍常用的 ...
随机推荐
- zabbix 监控 IPMI
1.IPMI的相关介绍: 智能平台管理接口(Intelligent Platform Management Interface)原本是一种Intel架构的企业系统的周边设备所采用的一种工业标准.IPM ...
- 一键安装LNMP
#!/bin/bash #2020年3月1日 #auto_install_lnmp. #by fly ################################ NGX_VER="$1 ...
- 自动化混沌工程 ChaosMeta V0.6 版本发布
混沌工程 ChaosMeta 的全新版本 V0.6.0 现已正式发布!该版本包含了许多新特性和增强功能,在编排界面提供了包括流量注入.度量等各类节点的支持,可视化支撑演练全流程.解决混沌工程原则中&q ...
- JVM核心知识体系(转)
1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...
- Python 包管理器入门指南
什么是 PIP? PIP 是 Python 包管理器,用于管理 Python 包或模块.注意:如果您的 Python 版本是 3.4 或更高,PIP 已经默认安装了. 什么是包? 一个包包含了一个模块 ...
- Android app的暗黑模式适配实现
原文地址: Android app的暗黑模式适配实现 - Stars-One的杂货小窝 很久之前放在草稿箱的一篇简单笔记,是之前蓝奏云批量下载工具Android版本实现暗黑主题的适配记录 本文所说的这 ...
- Hadoop学习(一) 搭建伪分布式集群
文章结构 1.准备工作 1.1 配置IP 1.2 关闭防火墙 1.3 修改主机名并与IP绑定 1.4 创建新用户 1.5 配置免密匙 2.安装并配置Hadoop伪分布式集群 2.1 安装Java 2. ...
- 计算机网络之防火墙和Wlan配置
一.防火墙 防火墙(firewall)是一种安全设备,它的位置一般处于企业网络边界与外网交界的地方,用于隔离不信任的数据包 准确点讲,它就是隔离外网和内网的一道屏障,用于保护内部资源信息安全的一种策略 ...
- java中Calendar日历类型常见方法
Calendar是Java中常用的时间处理工具之一,它提供了很多日历类型常见方法,下面是一些常用的方法及对应的代码和运行结果. 1. 如何创建 Calendar 日历对象 Calendar 是一个抽象 ...
- 趋势指标(一)MACD指标
MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA) ...