Activiti流程定义缓存源码分析9-流程缓存使用演示

    1. 缓存数据添加

可能读者学习到这里,一定非常好奇缓存数据的结构到底是什么?接下来,我们一睹为快吧,我们还是以开篇的流程为例,部署一个流程文档并启动新的流程实例,进而查看ACT_RU_TASK数据表的变化。根据上面缓存数据的解析步骤,我们可以推测出缓存的JSON数据应该是一个map集合,如图x-所示。

 

图x- 节点缓存数据的JSON格式

首先根节点必须有一个名称为"bpmn"(通过上面的解析处理流程,我们知道这个名称目前看来是固定不变的)的Map对象,该Map中定义了需要缓存的所有节点数据,节点以及节点对应的数据格式同样为Map结构,key为流程文档中的任务节点id,value为需要缓存的属性值,比如上面分别定义了 "usertask1"和 "usertask2"两个任务节点的名称以及处理人,如果流程文档中有更多的任务节点,则按照图x-中的JSON数据格式进行数据组装即可,如果流程实例运行一段时间需要修改以上信息,直接操作Redis进行修改即可。关于任务节点的哪些属性可以进行缓存,读者可以参考代码清单x-中的处理流程。脚本任务可以查看脚本任务的活动行为执行类ScriptTaskActivityBehavior中的execute函数。授之以鱼不如授之以渔,笔者在这里交给大家一个技巧,可以迅速地查看哪些节点支持缓存,以及需要缓存那些属性值。读者可以打开eclipse等开发工具首先定位到ProcessEngineConfiguration类,然后查找该类中的isEnableProcessDefinitionInfoCache函数点击右键,选Reference->Workingspace,这样所有可以使用节点缓存特性类都会被查询出来。效果如下图所示。

 

图x- isEnableProcessDefinitionInfoCache引用地方查找

了解了缓存数据的格式之后,我们自定义一个缓存添加类并为流程定义添加缓存以验证缓存是否生效。自定义缓存添加类相关代码如代码清单x-所示。

代码清单x-JedisTest.java

---------------------------------------------------------------------------------------------------------------------------

public static void main(String[] args) {

Jedis jedis=new Jedis("127.0.0.1");//Redis的ip端口

//自定义VO对象

ProcessDefinitionInfoCacheObjectVo v=new ProcessDefinitionInfoCacheObjectVo();

String string=

"{\"bpmn\":{\"usertask1\":{\"userTaskName\":\"${shaneiu}\",\"userTaskAssignee\":\"shaneiu\"}}}";

v.setInfoNode(string);v.setRevision(1);

//流程定义id

String key="shareniuNodeCache:myProcess:26:252504";

//添加到redis中 key一定要与自定义缓存类中的get函数key一直

jedis.set(key.getBytes(), MyProcessDefinitionInfoCache.toByteArray(v));

}

---------------------------------------------------------------------------------------------------------------------------

Redis的操作逻辑非常简单,从上面的代码可以看出,我们为已经部署好的流程定义文档进行缓存的添加操作(流程定义id为myProcess:26:252504),需要注意一点id为"usertask1"的任务节点名称我们设置为表达式,执行完毕以上代码之后,接下里我们启动一个流程实例看一下数据库中任务表中的数据变化进而验证缓存是否生效,启动流程相关代码如代码清单x-所示。

代码清单x-App.java

---------------------------------------------------------------------------------------------------------------------------

public void startProcessInstanceById() {

Map<String, Object> map=new HashMap<String, Object>();

map.put("shaneiu", "shaneiu1");

runtimeService.startProcessInstanceById("myProcess:26:252504",map); #-1

map.clear();

map.put("shaneiu", "shaneiu2");

runtimeService.startProcessInstanceById("myProcess:26:252504",map);#-2

}

---------------------------------------------------------------------------------------------------------------------------

为了方便测试,我们直接将需要的变量设置到map集合中,#-1启动流程实例之后,将map集合数据清空,再次设置新的值并重新启动一个流程实例如#-2所示。ACT_RU_TASK表的数据变化如图x-所示。

 

图x-ACT_RU_TASK表的数据变化。

关于Activiti中的缓存已经全部讲解完毕,希望读者有所收获和感悟。

技术团队支持:盘古BPM工作流平台

具体效果参考盘古BPM

发布了206 篇原创文章 · 获赞 580 · 访问量 177万+

猜你喜欢

转载自blog.csdn.net/qq_30739519/article/details/104226627