前面的话,我们使用的是classpath加载资源文件方式来部署流程定义的,但是这种方式有局限性,只能适合小项目,固定写死的流程;
实际项目的话,需要来动态导入流程定义文件,通过把bpmn和png文件打包成zip压缩包,然后用户界面直接导入到系统,然后解析,部署流程定义;
Activiti是支持这种方式的。今天我们来实现下这种方式;
首先第一步,把bpmn和png文件打成zip压缩包,放到diagrams文件夹下;
前面我们使用的是classpath加载流程定义文件;
我们新建一个测试类 ProcessDefinition
package com.java1234.activiti.test; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.junit.Test; public class ProcessDefinition { /** * 获取默认的流程引擎实例 会自动读取activiti.cfg.xml文件 */ private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义使用classpath方式 */ @Test public void deployWithClassPath(){ // 获取部署对象 Deployment deployment=processEngine.getRepositoryService() // 部署Service .createDeployment() // 创建部署 .addClasspathResource("diagrams/helloWorld.bpmn") // 加载资源文件 .addClasspathResource("diagrams/helloWorld.png") // 加载资源文件 .name("HelloWorld流程") // 流程名称 .deploy(); // 部署 System.out.println("流程部署ID:"+deployment.getId()); System.out.println("流程部署Name:"+deployment.getName()); } }
下面我们用zip方式来实现,新建一个deployWithZip方法:
/** * 部署流程定义使用zip方式 */ @Test public void deployWithZip(){ InputStream inputStream=this.getClass() // 获取当前class对象 .getClassLoader() // 获取类加载器 .getResourceAsStream("diagrams/helloWorld.zip"); // 获取指定文件资源流 ZipInputStream zipInputStream=new ZipInputStream(inputStream); // 实例化zip输入流对象 // 获取部署对象 Deployment deployment=processEngine.getRepositoryService() // 部署Service .createDeployment() // 创建部署 .name("HelloWorld流程2") // 流程名称 .addZipInputStream(zipInputStream) // 添加zip是输入流 .deploy(); // 部署 System.out.println("流程部署ID:"+deployment.getId()); System.out.println("流程部署Name:"+deployment.getName()); }
我们运行这个测试类:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 流程部署ID:7501 流程部署Name:HelloWorld流程2
说明已经部署成功了;
我们来看下相关表:
这里我们再来把几个关键表拎出来,好好熟悉下:
act_re_deployment 流程定义部署表:
我们会发现,这里多了一条记录;
act_re_procdef 流程定义表
流程定义表里,我们发现VERSION_字段 版本升级了,KEY依然是一样的;
act_ge_bytearry 资源文件表
资源表里相应的多里两条记录;
这里再提一个表 act_ge_property 属性表
这里的next_dbid是主键策略,就是规定好了下一次生成的id就是10001;
完整代码:http://pan.baidu.com/s/1o8nGOd0