
3.2 流程文档部署
3.2.1 定义流程文档
接下来深入学习流程文档部署的相关操作,需要了解一点,虽然使用几种不同的方式部署流程文档,但操作的流程文档均为同一个,这里对流程文档的内容进行统一描述,流程文档内容如代码清单3-2所示,根据该流程文档生成的图片如图3-2所示。

图3-2 流程定义生成的图片
mn.bp代码清单3-2 common

该流程文档的定义非常简单,一个开始节点、两个任务节点以及结束节点。接下来重点讲解该流程文档的部署操作。
注意
activiti.cfg.xml文件的配置,可以参考2.1.1节。流程文档中的元素id值必须全局唯一。
3.2.2 文本方式部署
addString方式部署流程文档的常用场景为:流程文档的内容大部分是固定不变的,只有少部分属性在流程文档部署时需要跟外部程序进行交互从而动态填充。例如,开发人员使用图形化工具绘制流程文档,有可能人员组织机构或者其他信息需要从数据库中动态查询,这时就可以使用该方式并结合模板引擎技术动态渲染数据,常用的模板引擎框架有Velocity、FreeMarker等,然后生成预期的流程文档内容。该方式就是客户端自定义流程设计器与原生设计器的一种过渡解决方案,具体实现如代码清单3-3所示。
代码清单3-3 DeploymentBuilderTest.java

该案例使用绝对路径方式获取流程文档的数据流,获取数据流的具体实现如代码3-4所示。

代码清单3-4 DeploymentBuilderTest.java
3.2.3 classpath资源部署
addClasspathResource方式部署流程文档:该方式会读取项目工程中classpath路径下的流程文档。使用该方式部署流程文档会使流程文档与项目产生高耦合,因此不建议在正式环境中使用。需要说明一点,如果使用该方式获取流程文档数据流则需使用/的方式对包名进行分割,形如com/shareniu/chapter3/common.bpmn,对应的文件结构如图3-3所示。

图3-3 包路径下文件流的获取
该方式的相关实现如代码清单3-5所示。
代码清单3-5 DeploymentBuilderTest.java

3.2.4 流式部署
3.2.4.1 inputStream部署
接下来使用addInputStream方式部署流程文档,具体实现如代码清单3-6所示。
代码清单3-6 DeploymentBuilderTest.java

在上述代码中,第3~4行直接使用类加载器获取common.bpmn文件的数据流,获取到数据流之后直接构造DeploymentBuilder实例对象,然后调用该实例对象的deploy()方法部署流程文档。
3.2.4.2 zipInputStream部署
以上三种部署方式,一次只能部署一个流程文档,如果期望一次性部署多个流程文档,很显然上面的部署方式是不支持的,但是很幸运,Activiti提供了打包部署机制,可以把多个流程文档以及流程文档对应的图片或者表单等统一打包为.zip的压缩文件(一般使用这种方式)或者.bar压缩文件,然后再对其进行部署,打包之后的结构如图3-4所示,相关实现如代码清单3-7所示。

图3-4 打包部署多个流程文档以及相关文件
代码清单3-7 DeploymentBuilderTest.java

使用addZipInputStream方式部署流程资源,需要将打包的流程文档或者图片等存放在压缩包中,其内部使用迭代器方式循环遍历压缩包中的文件并读取相应的文件流。
建议
可以跟进DeploymentBuilderImpl类中的addZipInputStream方法查看其处理机制。