美文网首页
activiti结合spring自动部署如何去重

activiti结合spring自动部署如何去重

作者: 西城丶 | 来源:发表于2020-05-12 16:37 被阅读0次

问题描述

activiti交给spring管理的时候,可以设置自动部署,就是把资源文件的路径设置到activiti的参数上,如果这个文件列表有一个文件被修改过了,那么activiti会重新部署所有资源文件,所以就会出现一个问题:如果我只修改了一个文件,但是activiti部署的时候却把其他的都部署了,导致不需要重新部署的文件也被部署了。所以优化主要是针对设置给activiti的资源文件列表去优化。

原先代码

private Resource[] getResources(){
   PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
   Resource[] resources = new Resource[0];
   try {
      Resource[] resourcesOne = resolver.getResources("classpath:/processes/**.bpmn");
      Resource[] resourcesTwo = resolver.getResources("classpath:/processes/**.bpmn20.xml");
      int lengthOne = resourcesOne.length;
      int lengthTwo = resourcesTwo.length;
      resources = new Resource[lengthOne + lengthTwo];
      System.arraycopy(resourcesOne, 0, resources, 0, lengthOne);
      System.arraycopy(resourcesTwo, 0, resources, lengthOne, lengthTwo);
   } catch (IOException e) {
      e.printStackTrace();
   }

   return resources;
}

原先代码是获取指定路径下的所有文件,所以会有重新部署的问题。

修改后的代码

private Resource[] getResources(){
   PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
   List<Resource> resourceResult = new ArrayList<>();
   try {
      // 去重处理,如果返回了多个文件,发现有一个文件内容不一样的话,
      // 就会把所有文件都部署一遍,这里是找出不同的进行部署就行了
      // 采用新旧文件的形式,只部署新目录,旧目录不部署,新目录部署完,移动文件到旧目录
      Resource[] resources = resolver.getResources("classpath*:/processes/new/**.bpmn");
      Resource[] oldResources = resolver.getResources("classpath*:/processes/**.bpmn");
      // 新旧文件MD5对比,如果文件MD5不一样,说明需要重新部署
      for (Resource resource : resources) {
         boolean doRemove = true;
         // 如果是文件的话,判断下已经部署的流程目录是否已经有部署了相同的文件(文件名相同即视为同一个文件)
         if(resource.isFile()){
            for (Resource oldResource : oldResources) {
               if(oldResource.isFile()){
                  if (oldResource.getFilename().equals(resource.getFilename())){
                     String oldResourceFileMd5 = DigestUtils.md5DigestAsHex(oldResource.getInputStream());
                     String newResourceFileMd5 = DigestUtils.md5DigestAsHex(resource.getInputStream());
                     if (oldResourceFileMd5.equals(newResourceFileMd5)){
                        doRemove = false;
                     }
                     break;
                  }
               }
            }
         }else{
            doRemove = false;
         }
         if (doRemove){
            // 执行拷贝动作,并返回新文件的路径
            FileUtils.copyFileToDirectory(resource.getFile(),oldResources[0].getFile().getParentFile());
            Resource resource1 = new ClassPathResource("/processes" + File.separator + resource.getFilename());
            resourceResult.add(resource1);
         }
      }
      // 删除新文件目录
      if (resources.length > 0){
         FileUtils.cleanDirectory(resources[0].getFile().getParentFile());
      }
   } catch (IOException e) {
      e.printStackTrace();
   }
   return resourceResult.toArray(new ClassPathResource[0]);
}

这里主要采用了新旧文件判断的去重方式

  1. 将需要部署的文件弄到new的文件夹下面
  2. 遍历new文件夹下的文件,遍历流程已经部署的文件
  3. 如果在流程已经部署的文件夹下找到了和new文件夹下一样的文件,说明是同一个,这个就是修改流程的操作,需要对两个文件进行md5加密对比,如果两个文件的md5值相同,说明是同一个文件,这时候就不需要重新部署,如果md5不同,就添加进需要部署的文件列表
  4. 如果在流程已经部署的文件夹下没有找到和new文件夹下一样的文件,那么说明是新的流程,直接加入需要部署的文件列表
  5. 将需要部署的文件拷贝到流程部署路径,并设置到activiti的部署资源路径下
  6. 删除new目录下的文件

相关文章

网友评论

      本文标题:activiti结合spring自动部署如何去重

      本文链接:https://www.haomeiwen.com/subject/dazbnhtx.html