前面的话,我们使用的是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