学习资料:《Activiti实战》

第五章 用户与组及部署管理(二)部署流程资源

内容概览:讲解流程资源的读取与部署。

5.2 部署流程资源

5.2.1 流程资源

流程资源常用的有以下几种:

 流程定义文件:拓展名为bpmn20.xml和bpmn
流程定义的图片:拓展名为PNG
表单文件:拓展名为form
规则文件:拓展名为drl

部署流程资源的时候,要注意一点:

引擎会根据不同的拓展名进行不同的处理。bpmn或bpmn20.xml类型的文件,会在ACT_RU_PROCDEF(流程定义表)、ACT_GE_BYTEARRAY(字节流表)两个表中都插入一条数据。而png类型的文件,只会在ACT_GE_BYTEARRAY表中插入一条数据。

所以可以看到,下文中所有部署,assertEquals(int,processDefinitionQuery)中的int都没有包含png的数目在内。

5.2.2 部署流程资源

启动一个流程实例processInstance,需要首先部署流程定义processDefinition,流程定义由许多活动Activity组成。

部署流程定义的方法有很多种,包括:

 classpath方式:addClasspathResource()
InputStream方式:addInputStream()
字符串方式:addString()
zip/bar方式:addZipInputStream()

(1)classpath方式

一般用在测试环节,真实的产品环境中很少用到这种方式。一般是管理页面手动部署或者设计完流程后直接部署到engine中。

项目中资源文件存放的位置:

示例代码(为了方便说明,没有使用链式编程,而是把每一步都分开写了):

 public class ClasspathDeploymentTest extends AbstractTest{
@Test
public void testClasspathDeployment throws Exception(){
String bpmnClasspath = "chapter5/candidateUserInUserTask.bpmn";
String pngClasspath = "chapter5/candidateUserInUserTask.bng"; DeploymentBuilder db = repositoryService.createDeployment();
db.addClasspathResource(bpmnClasspath);
db.addClasspathResource(pngClasspath);
db.deploy();

//验证部署是否成功
ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery();
long count = pdq.processDefinitionKey("candidateUserInUserTask").count;
assertEquals(1,count); //读取图片文件
ProcessDefinition pd = ProcessDefinitionQuery.singleResult();
String diagramResourceName = pd.getDiagramResourceName();
assertEquals(pngClasspath,diagramResourceName);
}
}

(2)InputStream方式

InputStream方式在产品环境中用的比较多,比如从web客户端接受一个文件对象,或者从URL中获取文件流,最后部署到engine中。

InputStream方式需要传入一个输入流资源的名称。输入流的来源不限,可以是绝对路径,可以是classpath,可以是网络获取。

(从绝对路径获取)示例代码:

 public class InputStreamDeploymentTest extends AbstractTest{
@Test
public void testInputStreamFromAbsoluteFilePath() throws Exception{
String filePath = "/Users/henryyan/work/books/aia-books/aia-codes/bpmn20-example/src/test/
resources/chapter5/userAndGroupInUserTask.bpmn"; FileInputStream fis = new FileInputStream(filePath);
repositoryService.createDeployment()
.addInputStream("userAndGroupInUserTask.bpmn",fis)
.deploy();//用userAndGroupInUserTask.bpmn作为资源名称

//验证部署是否成功
ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery();
long count = pdq.processDefinitionKey("userAndGroupInUserTask").count;
assertEquals(1,count);
}
}

(3)字符串方式

字符串方式是直接传入纯文本作为资源的来源。

示例代码:

 public class StringDeploymentTest extends AbstractTest{
//完整的text内容略
private String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>"; @Test
public void testCharsDeployment(){//用candidateUserInUserTask.bpmn作为资源名称
repositoryService.createDeployment().addString("candidateUserInUserTask.bpmn",text).deploy(); //验证部署是否成功
ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery();
long count = pdq.processDefinitionKey("candidateUserInUserTask").count;
assertEquals(1,count);
}
}

(4)zip/bar格式压缩包方式

前面三种方式一次都只能部署一个资源。除非执行多次deployment.addXXX()方法。

zip/bar方式,允许用户将资源打包,一次性部署多个资源。这几个资源关联的部署ID相同,因为属于同一次部署。

将文件打包为bar或者zip均可:

示例代码:

这里的addZipInputStream()相当于for循环了n次addInputStream()。

且这四个资源关联的是同一个deploymentID。

 public class ZipStreamDeploymentTest extends AbstractTest{
@Test
public class testZipStreamFromAbsoluteFilePath(){
InputStream zipStream = getClass().getClassLoader().getResourceAsStream("chapter5/chapter5-deployment.bar");
repositoryService.createDeployment().addZipInputStream(new ZipInputStream(zipStream)).deploy(); //验证部署是否成功
long count = repositoryService.createProcessDefinitionQuery().count();
assertEquals(2,count);//注意,不是4!!! //查询部署记录
Deployment deployment = repositoryService.createDeploymentQuery().singleResult();
assertNotNull(deployment); //验证四个文件均部署成功,且属于同一个部署ID
String deploymentID = deployment.getId();
assertNotNull(repositoryService.getResourceAsStream(deploymentID,"candidateUserInUserTask.bpmn"));
assertNotNull(repositoryService.getResourceAsStream(deploymentID,"candidateUserInUserTask.png"));
assertNotNull(repositoryService.getResourceAsStream(deploymentID,"userAndGroupInUserTask.bpmn"));
assertNotNull(repositoryService.getResourceAsStream(deploymentID,"userAndGroupInUserTask.png"));
}
}

2017.2.28 activiti实战--第五章--用户与组及部署管理(二)部署流程资源的更多相关文章

  1. 2017.2.28 activiti实战--第五章--用户与组及部署管理(三)部署流程及资源读取

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(三)部署流程及资源读取 内容概览:如何利用API读取已经部署的资源,比如读取流程定义的XML文件,或流程对应的图片文件. 以 ...

  2. 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...

  3. 2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单

    学习资料:<Activiti实战> 第七章  Spring容器集成应用实例(五)普通表单 第六章中介绍了动态表单.外置表单.这里讲解第三种表单:普通表单. 普通表单的特点: 把表单内容写在 ...

  4. 2017.2.28 activiti实战--第六章--任务表单(二)外置表单

    学习资料:<Activiti实战> 第六章 任务表单(二)外置表单 6.3 外置表单 考虑到动态表单的缺点(见上节),外置表单使用的更多. 外置表单的特点: 页面的原样显示 字段值的自动填 ...

  5. 2017.2.28 activiti实战--第六章--任务表单(一)动态表单

    学习资料:<Activiti实战> 第六章 任务表单(一)动态表单 内容概览:本章要完成一个OA(协同办公系统)的请假流程的设计,从实用的角度,讲解如何将activiti与业务紧密相连. ...

  6. 2017.2.21 activiti实战--第十三章--流量数据查询与跟踪(一)查询接口介绍及运行时数据查询

    学习资料:<Activiti实战> 第十三章 流量数据查询与跟踪 本章讲解运行时与历史数据的查询方法.主要包含三种:标准查询,Native查询,CustomSql查询. 13.1 Quer ...

  7. 2017.2.22 activiti实战--第六章--任务表单

    学习资料:<Activiti实战> 第六章 任务表单 本章将一步步完成一个协同办公系统(OA)的请假流程的设计,讲解如何将Activiti和实际业务联系起来. 首先讲解动态表单与外置表单的 ...

  8. 2017.2.21 activiti实战--第七章--Activiti与spring集成(一)配置文件

    学习资料:<Activiti实战> 第七章 Activiti与容器集成 本章讲解activiti-spring可以做的事情,如何与现有系统集成,包含bean的注入.统一事务管理等. 7.1 ...

  9. 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(二)简单示例

    学习资料:<Activiti实战> 第一章 搭建Activiti开发环境及简单示例 2.5 简单流程图及其执行过程 (1)leave.bpmn 后缀名必须是bpmn.安装了activiti ...

随机推荐

  1. Rust学习资源和路线

    Rust学习资源和路线 来源 https://rust-lang-cn.org/article/23 学习资源 The Rust Programming Language 堪称Rust的"T ...

  2. BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】

    题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...

  3. 邻面合并(merging)

    邻面合并(merging) 题目描述 给定一个N×MN×M的网格,每个格子上写有0或1.现在用一些长方形覆盖其中写有1的格子,长方形的每条边都要与坐标轴平行.要求:每个写着1的格子都要被覆盖,长方形不 ...

  4. Fabric 和 Sawtooth 技术分析(下)

    http://blog.talkingdata.com/?p=6172 在前一篇文章(Fabric和Sawtooth技术分析(上))中,我们着重跟大家分享了 Fabric 相关的内容,在本篇文章中,我 ...

  5. Python 安装MySQLdb模块遇到报错及解决方案:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory

    一.问题 系统:win7 64位 在下载MySQL-python-1.2.5.zip,使用python setup.py install 安装时,出现以下报错: _mysql.c(42) : fata ...

  6. filesystem

    1 tmpfs 以下来源于维基百科: tmpfs是类Unix系统上暂存档存储空间的常见名称,通常以挂载文件系统方式实现,并将数据存储在易失性存储器而非永久存储设备中.和RAM disk的概念近似,但后 ...

  7. js数据类型判断

    在一般情况下使用typeof 但是有时候typeof返回的结果都是object,比如数组和json对象的时候,这个时候需要用到 instanceof了 还有一个更好得办法,Object.prototy ...

  8. iOS 关于请求参数在cookie里面

    一.首先了解一下什么cookie cookie是在客户端存储服务器状态的一种机制.web服务器可以通过set-cookie或者set-cookie2 HTTP头部设置cookie. Cookie可以分 ...

  9. 回文串(bzoj 3676)

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  10. 汕头市队赛 SRM10 dp只会看规律 && bzoj1766

    dp只会看规律 SRM 10 描述 平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖) 输入格式 第一行两个整数n,S接下来n行每行两个整数xi,yi ...