activiti工作流

activiti实战--部署流程资源

2019-03-04  本文已影响23人  我有一只喵喵

activiti实战--部署流程资源


流程资源可以是各种类型的文件,在启动流程或流程实例运行过程中会被读取

一、常用流程资源

流程定义文件:扩展名为bpmn20.xml和bpmn

流程定义的图片:用BPMN2.0规范的各种图形描绘,一般用png格式

表单文件:把表单内容保存在一个扩展名为form的文件中

规则文件:例如Dro'o'ls的规则文件,扩展名为drl

二、部署流程资源涉及到的表

存放流程定义的显示名和部署时间,每部署一次增加一条记录

存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。注意:当流程定义的key相同的情况下,使用的是版本升级。

存储流程定义相关的部署信息。即流程定义文档的存放地。每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件, activiti会在部署时解析bpmn文件内容自动生成流程图)。两个文件不是很大,都是以二进制形式存储在数据库中

三、部署流程资源方式

使用流程引擎的目的是为了使用流程驱动业务的流转。要用流程驱动业务就必须为业务启动一个流程实例,启动一个流程实例必须定义一系列活动,这一系列活动就组成了一个流程定义

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 方式部署流程资源需要传入一个输入流及资源的名称,输入流的来源不限,可以从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读取文件流后部署到引擎

以上方式一次只能部署单个流程、除非多次调用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模型方式

见BPMN的使用


四、以上部署方式使用建议

  1. 如果客户端需要开发一套流程设计器建议使用addBpmnModel方式部署,该方式更加灵活,可塑性强
  2. 如果一次性需要部署多个流程资源,建议使用addZipInputStream方式。该方式常见的场景时,在web项目中使用文件上传的方式对流程资源进行部署。
  3. addClassPahResource方式不建议在生产环境中使用,使用该方式会使流程文档与项目高耦合,不灵活。
上一篇下一篇

猜你喜欢

热点阅读