文档章节

利用静态服务提升读取Activiti流程图的性能

Yemon
 Yemon
发布于 2016/05/17 10:32
字数 1085
阅读 2
收藏 0

1. 现有模式

流程图可以方便用户浏览整个流程的处理过程,或者跟踪参与过的流程的处理状态(当前处于哪个节点、谁在办理、时间等信息),首先需要调用引擎的API读取流程图(二进制流形式),代码如下:

?
1
2
3
4
5
6
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
byte [] b = new byte [ 1024 ];
int len = - 1 ;
while ((len = resourceAsStream.read(b, 0 , 1024 )) != - 1 ) {
   response.getOutputStream().write(b, 0 , len);
}

1.1 性能问题

对于上面的代码当经常需要读取图片资源时每次都需要在数据库读取上花费时间,用java输出二进制流也需要一定的时间消耗,所以在一定程度上影响了性能,导致图片读取速度慢甚至超时

从上面的代码可以看出当从前端读取一张图片资源时需要经过一下几个步骤:

  1. 发送HTTP请求
  2. 根据资源名称(图片文件名称,可以从流程定义对象获取)和Deployment ID读取二进制流
  3. 把二进制流输出到前端

如果多个用户请求同一个资源那就要把以上的三个步骤for...each执行N次,也就是说N-1次的数据库读取是浪费的,因为流程定义对象是唯一的,每一次部署后引擎都会把和流程定义生成的图片(或者部署时提供的图片资源)保存到数据库,当需要时通过上面的代码读取,如果把第一次读取的流程资源(泛指和流程有关的各种资源文件)缓存起来可以解决这个问题。

有的读者可能想到使用一个全局Map来保存,但是这样会消耗大量的内存,此举不推荐。

2. 使用静态资源做缓存

大家都知道HTTP服务器最适合做静态资源的访问,例如Apahce、Nginx等;考虑一下这样的一个部署流程的步骤:

  1. 调用引擎的部署流程API
  2. 读取该次部署的所有需要缓存的资源
  3. 把换成的资源二进制流保存(持久化)到硬盘上的某个目录(暂且称之为diagrams
  4. 用Apache或者Nginx以目录diagrams开启一个目录服务(可以列出目录中的子目录和文件)
  5. 前端访问图片资源时直接从静态服务获取,访问资源的路径可以通过流程定义或许,例如:
    http://aws.kafeitu.me:10000/diagrams/leave-formkey/1/leave-formkey.png
    leave-formkey表示流程定义的KEY属性,1表示版本号leave-formkey.png表示资源名称

2.1 导出图片资源

为大家提供一个通用方法可以导出已部署流程定义的流程图,保存到硬盘上的指定目录。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* 导出图片文件到硬盘
*
* @return 文件的全路径
*/
public static String exportDiagramToFile(RepositoryService repositoryService,
         ProcessDefinition processDefinition, String exportDir) throws IOException {
     String diagramResourceName = processDefinition.getDiagramResourceName();
     String key = processDefinition.getKey();
     int version = processDefinition.getVersion();
     String diagramPath = "" ;
 
     InputStream resourceAsStream = repositoryService
             .getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);
     byte [] b = new byte [resourceAsStream.available()];
 
     @SuppressWarnings ( "unused" )
     int len = - 1 ;
     resourceAsStream.read(b, 0 , b.length);
 
     // create file if not exist
     String diagramDir = exportDir + "/" + key + "/" + version;
     File diagramDirFile = new File(diagramDir);
     if (!diagramDirFile.exists()) {
       diagramDirFile.mkdirs();
     }
     diagramPath = diagramDir + "/" + diagramResourceName;
     File file = new File(diagramPath);
 
     // 文件存在退出
     if (file.exists()) {
       // 文件大小相同时直接返回否则重新创建文件(可能损坏)
       logger.debug( "diagram exist, ignore... : {}" , diagramPath);
       return diagramPath;
     } else {
       file.createNewFile();
     }
 
     logger.debug( "export diagram to : {}" , diagramPath);
 
     // wirte bytes to file
     FileUtils.writeByteArrayToFile(file, b, true );
     return diagramPath;
}

在部署流程时调用一下方法exportDiagramToFile()即可。

2.2 搭建静态资源服务

根据实际情况选择使用Apache、Nginx或者仅仅用于测试,例如笔者在亚马逊的AWS上使用python的SimpleHttpServer开启了一个简单的目录服务: http://aws.kafeitu.me:10000 ,其中的diagrams目录中的文件就是通过方法exportDiagramToFile导出的。

3. 从静态服务读取资源

原来的URL是这样拼接的:

?
1
< a target = "_blank" href = '${ctx }/workflow/resource/deployment?deploymentId=${process.deploymentId}&resourceName=${process.diagramResourceName }' >${process.diagramResourceName }

现在是这样:

?
1
< a target = "_blank" href = 'http://localhost:10000/${process.key}/${process.version}/${process.diagramResourceName }' >${process.diagramResourceName }

性能提升大概在三倍左右,具体取决于使用的静态服务和网速。

本文转载自:http://blog.csdn.net/hj7jay/article/details/50848820

共有 人打赏支持
Yemon
粉丝 10
博文 321
码字总数 23076
作品 0
广州
架构师
私信 提问
带你进入 Activiti 工作流的世界

Activiti 是一个针对企业用户、开发人员 、系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 、 稳定的 BPMN2.0 流程引擎 。它可以与 spring 完美集成。 创始人 Tom Ba...

deniro
06/17
0
0
十分钟认识Activiti6.0工作流引擎

概述 了解Activiti 假如你还不知道Activiti是什么,那么工作流引擎对你来说一定也是新的,解决Activiti和工作流知识盲点,所以看到到这里就对了,还有Android同学会误以为是“Activity”,工...

JimmyNo1
06/13
0
0
Activiti工作流引擎使用

Activiti工作流引擎使用 1.简单介工作流引擎与Activiti 对于工作流引擎的解释请参考百度百科:工作流引擎 1.1 我与工作流引擎 在第一家公司工作的时候主要任务就是开发OA系统,当然基本都 是...

jxlgzwh
2014/09/25
0
0
Activiti简介

什么是工作流 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。 简单的说,流程就是多个人在一起合作...

科技小能手
2017/11/12
0
0
Activiti 5.16 版本发布 - 基于BPMN2.0规范的流程引擎

Activiti 5.16 版本发布,此版本更新内容如下: 添加了对Spring boot的支持,支持更多的Spring注解(多谢Josh Long) 重构作业执行器(调度器)简化逻辑,防止长时间等待 添加了新的事件(全...

咖啡兔
2014/07/23
7.9K
6

没有更多内容

加载失败,请刷新页面

加载更多

Nginx+Keepalived实现站点高可用

Nginx+Keepalived实现站点高可用

吴伟祥
28分钟前
2
0
git常用命令速查表

任梁荣
31分钟前
2
0
一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)

摘要: 本文介绍使用opencv和yolo完成图像目标检测,代码解释详细,附源码,上手快。 计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别、行人检测等,国内...

阿里云官方博客
33分钟前
0
0
SpringBoot整合RabbitMQ之典型应用场景实战二

实战前言 RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步...

liwei2000
34分钟前
1
0
ES6这些就够了

刚开始用vue或者react,很多时候我们都会把ES6这位大兄dei加入我们的技术栈中。但是ES6那么多那么多特性,我们真的需要全部都掌握吗?秉着二八原则,掌握好常用的、有用的这个可以让我们的开...

文文1
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部