activiti实战--部署流程资源
流程资源可以是各种类型的文件,在启动流程或流程实例运行过程中会被读取
一、常用流程资源
流程定义文件:扩展名为bpmn20.xml和bpmn
流程定义的图片:用BPMN2.0规范的各种图形描绘,一般用png格式
表单文件:把表单内容保存在一个扩展名为form的文件中
规则文件:例如Dro'o'ls的规则文件,扩展名为drl
二、部署流程资源涉及到的表
- act_re_deployment(部署对象表)
存放流程定义的显示名和部署时间,每部署一次增加一条记录
- act_re_procdef(流程定义表)
存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。注意:当流程定义的key相同的情况下,使用的是版本升级。
- act_ge_bytearray(资源文件表)
存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件, activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中
三、部署流程资源方式
使用流程引擎的目的是为了使用流程驱动业务的流转。要用流程驱动业务就必须为业务启动一个流程实例,启动一个流程实例必须定义一系列活动,这一系列活动就组成了一个流程定义
-
classpath方式部署流程资源
classpath方式,顾名思义就是要以class目录为基础寻找对应的资源再部署
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//定义classpath
String processPath = "process/2-4.bpmn20.xml";
//创建部署构建器---->部署入口
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
//添加流程资源文件
deploymentBuilder.addClasspathResource(processPath).deploy();
//执行部署。此操作会将流程定义文件内容持久化到数据库,并且以addClassPathResouce(resourceName)的参数作为资源名称
Deployment deploy = deploymentBuilder.deploy();
//获取部署的流程
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
classpath方式一般用于开发阶段的测试环节,真正再产品环境中用的很少,而是通过管理界面手动部署或在设计完流程之后直接部署到引擎中
-
InputStream 方式部署流程资源
使用InputStream 方式部署流程资源需要传入一个输入流及资源的名称,输入流的来源不限,可以从classpath,可以从绝对路径,亦可以从网络
RepositoryService repositoryService = processEngine.getRepositoryService();
String filePath = "E:\\activitistudy\\acticitiDemo1\\src\\main\\resources\\process\\2-4.bpmn20.xml";
//创建文本输入对象
FileInputStream fileInputStream = new FileInputStream(filePath);
//创建部署构建器
DeploymentBuilder deployment = repositoryService.createDeployment();
//参数一作为资源名称,参数二为流程资源输入流
Deployment deploy = deployment.addInputStream("2-4bpmn", fileInputStream).deploy();
System.out.println(deploy.getId());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
System.out.println(processDefinition.getResourceName());
InputStream 方式从产品环境中用的比较多,例如从WEB客户端接受一个文件对象部署到引擎中,或者从URL读取文件流后部署到引擎
-
zip/bar格式压缩包方式部署流程
以上方式一次只能部署单个流程、除非多次调用deployment.addXXX(),那么如何一次性部署多个流程资源呢?activiti 允许把一批资源打包部署
RepositoryService repositoryService = processEngine.getRepositoryService();
//从class读取zip资源文件流
InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("resources.zip");
DeploymentBuilder deployment = repositoryService.createDeployment();
Deployment deploy = deployment.addZipInputStream(new ZipInputStream(resourceAsStream)).deploy();
System.out.println(repositoryService.createProcessDefinitionQuery().count());
- Bpmn模型方式
四、以上部署方式使用建议
- 如果客户端需要开发一套流程设计器建议使用addBpmnModel方式部署,该方式更加灵活,可塑性强
- 如果一次性需要部署多个流程资源,建议使用addZipInputStream方式。该方式常见的场景时,在web项目中使用文件上传的方式对流程资源进行部署。
- addClassPahResource方式不建议在生产环境中使用,使用该方式会使流程文档与项目高耦合,不灵活。