通过Classpath的方式加载资源文件来部署流程定义,这种方式始终有局限性,只能适合小项目固定流程写死的。
实际项目的话,需要使用动态导入流程定义文件,可以通过bpmn和png文件打包成zip压缩包,
然后用户界面直接导入到系统,然后在解析部署流程定义,Activiti插件是支持这种方式的。
把bpmn流程文件和png流程图文件打成zip压缩包,
放到diagrams文件下( 在真实的项目中是通过文件上传实现的):
创建一个新的测试类ActivitHelloWorldZIPTest 其中新建一个deployWithZip()方法用zip方式来实现:
/**
* 部署流程定义使用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
已经成功部署流程定义了。
之后仔细观察Activiti25张表中的一些数据变化:
1.act_re_deployment 流程定义部署表
2.act_re_procdef 流程定义表
3.act_ge_bytearry 资源文件表
4.act_ge_property 属性表