文档章节

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

Yemon
 Yemon
发布于 2016/05/17 10:32
字数 1085
阅读 2
收藏 0
点赞 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
博文 320
码字总数 22799
作品 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 5.16 版本发布 - 基于BPMN2.0规范的流程引擎

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

咖啡兔
2014/07/23
7.9K
6
Activiti简介

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

科技小能手
2017/11/12
0
0
Activiti Designer 5.12.0 发布

Activiti 5.12发布之后Activiti Designer迎来了5.12.0版本,该版本虽然没有添加对BPMN2.0规范支持,但是在使用方面大大提升,很值得升级! 1. 打开无BPMN DI信息的流程文件自动排列 可能很多...

咖啡兔
2013/03/25
3.3K
5
动静内容混合站点,怎样用全站加速支持实际业务场景?

伴随着近几年O2O的爆发,网络已经不仅是传统的展示企业品牌的渠道,而逐渐演变成为嫁接企业和用户之间服务和交流的桥梁,我们开始赋予网络更多的功能,比如购物、出行、学习、娱乐等等。 同时...

樰篱
05/31
0
0
Activiti6.0零编程部署工作流(一)

概述 前一篇文章《十分钟认识Activiti6.0工作流引擎》站在工程师的视角快速编码体验了一把工作流,为了更纯粹的体验Activiti提供的核心API的功能,我们在命令行交互下体验了流程审批的过程,...

JimmyNo1
06/27
0
0
Activiti工作流引擎初学教程

http://wenku.baidu.com/view/bb7364ad4693daef5ff73d32.html 1. 初识Activiti 1.1. 工作流与工作流引擎 工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起...

孟飞阳
2016/07/31
469
0
三分钟了解Activity工作流

一、 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请...

java1990
2015/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat中JAVA JVM内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
1分钟前
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
6分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
12分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
12分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
16分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
16分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
16分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
18分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树

liuyan_lc
20分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部