问题描述
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]);
}
这里主要采用了新旧文件判断的去重方式
- 将需要部署的文件弄到new的文件夹下面
- 遍历new文件夹下的文件,遍历流程已经部署的文件
- 如果在流程已经部署的文件夹下找到了和new文件夹下一样的文件,说明是同一个,这个就是修改流程的操作,需要对两个文件进行md5加密对比,如果两个文件的md5值相同,说明是同一个文件,这时候就不需要重新部署,如果md5不同,就添加进需要部署的文件列表
- 如果在流程已经部署的文件夹下没有找到和new文件夹下一样的文件,那么说明是新的流程,直接加入需要部署的文件列表
- 将需要部署的文件拷贝到流程部署路径,并设置到activiti的部署资源路径下
- 删除new目录下的文件
网友评论