第四节:Activiti6.0——使用zip、bpmn代码生成流程图的资源部署以及资源的查询

本人个人博客网站,欢迎访问:学教府

一、发布资源

说明:从存储服务RepositoryService可以获取发布生成器DeploymentBuilder,该生成器中可以调用添加资源的方法,有不同资源的添加,然后调用deploy()方法进行发布。具体的添加方法如下:

DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);

DeploymentBuilder addClasspathResource(String resource);

DeploymentBuilder addString(String resourceName, String text);

DeploymentBuilder addBytes(String resourceName, byte[] bytes);

//zip压缩文件
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);

//bpmn文件
DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);

此处只测试压缩文件bpmn资源的发布与读取。
① 发布压缩文件

  1. 添加压缩文件到resource目录下(该压缩文件只包含两个txt文件):
    压缩文件
  2. 编码进行发布
    //获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    //获取存储服务
    RepositoryService repositoryService = processEngine.getRepositoryService();
    
    //获取压缩文件流
    FileInputStream fileInputStream = new FileInputStream(new File("resource/datas.zip"));
    ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
    
    //获取发布生成器
    DeploymentBuilder deployment = repositoryService.createDeployment();
    //添加压缩文件流
    deployment.addZipInputStream(zipInputStream);
    
    //发布
    deployment.deploy();
    
    //关闭
    processEngine.close();
    System.exit(0);
    

3.查看:

  • 在act_re_deployment表中查看发布数据:
    发布
  • 在act_ge_bytearray表查看具体的资源数据:
    具体资源
    ②发布bmpn(不使用文件,代码生成)
  1. 编码如下:
     	public static void main(String[] args) {
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            DeploymentBuilder deployment = repositoryService.createDeployment();
    
            deployment.addBpmnModel("myProcess.bpmn", createBpmnModel());
    
            Deployment deploy = deployment.deploy();
    
    		//根据流程资源导出bpmn文件,数据库中同时会生成png资源以及流程定义表的数据
    		//FileUtils是commons-io-2.4.jar里面
            InputStream processBpmn =
                    repositoryService.getResourceAsStream(deploy.getId(),  "myProcess.bpmn");
            FileUtils.copyInputStreamToFile(processBpmn, new File("test/aaa.bpmn"));
    		
            RuntimeService runtimeService = processEngine.getRuntimeService();
    
    		//生成一个流程实例
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("xjfProcess1");
            System.out.println("流程实例ID:" + processInstance.getId());
    
            processEngine.close();
            System.exit(0);
        }
    
        /**
         * 获取BPMN模型对象,跟使用bpmn文件和xml文件是一样的
         * @return
         */
        private static BpmnModel createBpmnModel(){
            //创建BPMN模型对象
            BpmnModel bpmnModel = new BpmnModel();
    
            //创建一个流程定义
            Process process = new Process();
            bpmnModel.addProcess(process);
    
            process.setId("myProcess");
            process.setName("My Process");
    
            //开始事件
            StartEvent startEvent = new StartEvent();
            startEvent.setId("startEvent");
            process.addFlowElement(startEvent);
    
            //用户事件
            UserTask userTask = new UserTask();
            userTask.setId("userTask");
            userTask.setName("User Task");
            process.addFlowElement(userTask);
    
            //结束事件
            EndEvent endEvent = new EndEvent();
            endEvent.setId("endEvent");
            process.addFlowElement(endEvent);
    
            //添加流程顺序
            SequenceFlow sf1 = new SequenceFlow("startEvent", "userTask");
            sf1.setId("_" + UUID.randomUUID().toString());
            process.addFlowElement(sf1);
    
            SequenceFlow sf2 = new SequenceFlow("userTask", "endEvent");
            sf2.setId("_" + UUID.randomUUID().toString());
            process.addFlowElement(sf2);
    
            //生成BPMN自动布局,根据流程属性的定义自动生成对应的位置等信息
            //需要导入jgraphx-1.10.4.1.jar
            new BpmnAutoLayout(bpmnModel).execute();
    
            return bpmnModel;
        }
    
  2. 查看
    bpmn

二、activiti对bpmn文件的验证

概述:在发布bpmn文件时,activiti会对文件的标签和逻辑进行验证,如果验证不通过则会抛出异常。

  1. 标签不正确的验证
  • xml如下图;
    标签不正确
  • 报错
    Exception in thread "main" org.activiti.bpmn.exceptions.XMLException: cvc-complex-type.2.4.a: 发现了以元素 'abc' 开头的无效内容。
    
  • 取消验证标签属性
    DeploymentBuilder deployment = repositoryService.createDeployment();
    deployment.addClasspathResource("my_process.bpmn");
    //去掉标签结构验证
    deployment.disableSchemaValidation();
    
  1. 逻辑不正确的验证
  • bpmn图如下:
    bpmn图
  • 报错如下:
    报错
  • 关闭逻辑验证:
    //关闭对bpmn逻辑的验证
    deployment.disableBpmnValidation();
    

三、查询部署的资源

概述:当我们发布成功后,可以对发布的资源进行查询。

  1. 查询文本资源
    //1.首先发布文本资源
    DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
    deploymentBuilder.addClasspathResource("my_text.txt");
    Deployment deployment = deploymentBuilder.deploy();
    
    //读取文本资源
    InputStream resourceAsStream = repositoryService.getResourceAsStream(deployment.getId(), "my_text.txt");
    int count = resourceAsStream.available();
    byte[] bytes = new byte[count];
    resourceAsStream.read(bytes);
    String text = new String(bytes);
    System.out.println(text);
    
    //结果:this is xjf's text
    
  2. 查询bpmn的xml资源
    DeploymentBuilder builder = repositoryService.createDeployment();
    builder.addClasspathResource("query.bpmn");
    Deployment deployment = builder.deploy();
    
    //读取xml文件
    System.out.println("depoyment的id:" + deployment.getId());
    //获取流程定义
    ProcessDefinition processDefinition = repositoryService
                                    .createProcessDefinitionQuery()
                                    .deploymentId(deployment.getId())
                                    .singleResult();
    
    System.out.println("processDefinition的id:" + processDefinition.getId());
    //获取资源的输入流
    InputStream processModel = repositoryService.getProcessModel(processDefinition.getId());
    int count = processModel.available();
    byte[] bytes = new byte[count];
    processModel.read(bytes);
    String xml = new String(bytes);
    System.out.println(xml);
    

结果
结果
3. 查询bpmn的图片资源:

Deployment deployment = repositoryService.createDeployment().addClasspathResource("query.bpmn").deploy();

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();

//读取流程资源图片
InputStream inputStream = repositoryService.getProcessDiagram(processDefinition.getId());

BufferedImage image = ImageIO.read(inputStream);

System.out.println("图片:" + image);
//保存为图片文件
File file = new File("resource/image/result.png");
if (!file.exists()){
    file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(image,"png",fos);

fos.close();
inputStream.close();

查看图片:
路径
bpmn图

四、删除部署文件

删除部署数据:
1. 不管是否指定级联,都会删除部署相关的身份数据、流程定义数据、流程资源与部署数据
2. 如果设置为级联删除,则会将运行的流程实例、流程任务以及流程实例的历史数据删除
3. 如果不级联删除,但是存在运行时数据,例如还有流程实例,就会删除失败

五、过滤重复部署

  • 当进行第一次部署后,资源没有发生变化而再次进行部署的话,同样会将部署数据写入到数据库中。如果想避免这种情况,可以调用DeploymentBuilder的enableDuplicateFiltering方法。
  • 在执行deploy方法时,如果发现该值为true,则根据部署对象的名称去查找最后一条部署记录,如果发现最后一条部署记录与当前需要部署的记录一致,则不会重复部署。(此处的记录一致,是指DeploymentEntity下的资源是否相同,包括资源名称和资源内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值