上面我们浓墨重彩地讲述了自定义节点缓存类以及将其注入流程引擎配置类实例的过程,可能读者有个疑问?节点定义的缓存数据格式是什么呢?流程引擎执行节点的时候,又是如何获取并解析节点所缓存的数据呢?这也是接下来我们需要重点讲解的地方。任务节点的缓存信息当然是在任务需要执行的地方进行解析了,比如任务的完成操作或者任务节点的入库操作。关于这一点读者可以参考之前的章节。在此我们直接找到任务节点的行为执行类UserTaskActivityBehavior的执行函数execute,相关代码如代码清单x-所示。

代码清单x-UserTaskActivityBehavior.java---------------------------------------------------------------------------------------------------------------------------public void execute(ActivityExecution execution) throws Exception {...if (Context.getProcessEngineConfiguration().isEnableProcessDefinitionInfoCache()) {#-1ObjectNode taskElementProperties = Context.getBpmnOverrideElementProperties(userTaskId, execution.getProcessDefinitionId()); #-2activeNameExpression = getActiveValue(taskDefinition.getNameExpression(), "userTaskName", taskElementProperties); #-3taskDefinition.setNameExpression(activeNameExpression); #-4...}Expression getActiveValue(Expression originalValue, String propertyName, ObjectNode taskElementProperties) {Expression activeValue = originalValue;if (taskElementProperties != null) {JsonNode overrideValueNode = taskElementProperties.get(propertyName);if (overrideValueNode != null) {if (overrideValueNode.isNull()) {activeValue = null;} else {activeValue = Context.getProcessEngineConfiguration().getExpressionManager().createExpression(overrideValueNode.asText());}}}return activeValue;}---------------------------------------------------------------------------------------------------------------------------

上面的代码处理逻辑非常的复杂,我们暂且将关注点放到节点缓存的获取操作中,首先#-1验证引擎是否开启了节点缓存(参考代码清单x中的配置属性值),如果流程引擎开启了节点缓存功能,则首先从缓存中查找节点的缓存数据,并对其进行解析和运用如#-4所示。#-2和#-3完成从缓存中取出数据并对taskDefinition属性进行填充。由于该过程涉及到了缓存数据的获取和解析,所以我们应该重点学习该过程的处理流程。首先来看看这个方法的时序图,如图x-所示。

图x-getBpmnOverrideElementProperties函数执行时序图

看到图x-我们才知道什么叫山路十八弯,饶了半天才真正的切入主题,比如缓存数据的获取以及根据任务节点id进行必要属性的获取工作。我们根据上面的时序图来分析一下execute函数究竟做了工作?根据上面的时序图我们尝试梳理整个处理过程如下。

  1. 获取缓存中的数据。当进入getBpmnOverrideElementProperties方法后首先根据流程定义id从缓存中获取数据,获取缓存数据的时候,Activiti在当前函数getBpmnOverrideContext中做了一层功能架构。首先调用函数getBpmnOverrideContext确保当前类中的bpmnOverrideContextThreadLocal成员变量已经被初始化,然后委托DeploymentManager类进行节点缓存的获取工作,最后调用addBpmnOverrideElement函数将获取到的节点数据进行缓存。需要注意bpmnOverrideContextThreadLocal为ThreadLocal类型,ThreadLocal是为了解决线程安全的问题而设计的,该类内部维护一个Map集合,用于存储每一个线程变量的副本,Map中的键为当前线程对象,值为对应线程的变量副本,由于键是不能重复的,从而达到了线程安全的目的。
  2. 根据任务节点的id值从缓存中查找需要的数据集合。经过步骤一之后,流程中所有的节点缓存数据已经被获取到了,接下来的工作就是对获取到的数据进行解析,首先委托DynamicBpmnService类中的函数getBpmnElementProperties进行指定值的获取,节点数据的获取逻辑也很简单,首先调用getBpmnNode方法获取ObjectNode对象中key为“bpmn”的值,如果获取到,则以id值为查询条件并从查询结果中获取该id值下面所有的数据集合并返回,以方便#-3函数进行使用。
  3. #-3函数进行该节点下配置的所有缓存属性值的获取工作如getActiveValue函数所示。该函数根据指定的属性从集合中获取相应的值,如果获取到值则创建表达式,形如${shareniu}。由此可知,节点中的缓存数据值是可以使用Juel表达式的。关于用户节点可以配置缓存的key都定义在DynamicBpmnConstants接口中。由于上面所涉及到的函数处理逻辑都很简单,读者有兴趣可以结合时序图x-进行源码跟进学习。

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

具体效果参考盘古BPM

Activiti流程定义缓存源码分析8-流程缓存自定义原理相关推荐

  1. Activiti流程定义缓存源码分析5-流程缓存

    谈起节点缓存,可能读者有个疑问,缓存节点的意义何在,哪些节点支持缓存呢?需要在哪里配置节点缓存值呢?节点缓存的数据格式又是什么呢?首先我们有一种常见的应用场景,比如我们定义流程文档的时候,通常任务节点 ...

  2. Activiti流程定义缓存源码分析7-流程缓存自定义

    接下来,重点看一下Activiti中如何自定义流程缓存. 上面我们提到过自定义类首先需要继承StandaloneProcessEngineConfiguration类并通过动态属性注入方式为引擎配置类 ...

  3. 【深入浅出MyBatis系列十一】缓存源码分析

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 深入浅出MyBatis系列 [深入浅出MyBatis系列一]MyBatis入门 [深入浅出MyBatis系列二]配置 ...

  4. okhttp配置缓存策略_Okhttp缓存源码分析以及自定义缓存实现

    原标题:Okhttp缓存源码分析以及自定义缓存实现 昨日,南京市公安局官方微博"平安南京"发布公告称,钱宝实际控制人张小雷因涉嫌违法犯罪于26日向当地警方投案自首.消息一出,迅速引 ...

  5. ceph bluestore 源码分析:刷缓存(trim)逻辑

    环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存.即将dump ...

  6. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )

    文章目录 前言 一.ActivityManagerService.attachApplicationLocked 二.ActivityStackSupervisor.attachApplication ...

  7. Android源码分析—属性动画的工作原理

    转载请注明出处: http://blog.csdn.net/singwhatiwanna/article/details/17853275 前言 本文为Android动画系列的最后一篇文章,通过对源码 ...

  8. 【转】ABP源码分析十三:缓存Cache实现

    ABP中有两种cache的实现方式:MemoryCache 和 RedisCache. 如下图,两者都继承自ICache接口(准确说是CacheBase抽象类).ABP核心模块封装了MemoryCac ...

  9. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

最新文章

  1. 工作笔记---巡检记录
  2. javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
  3. 数据库基础之一--DDL(数据库定义语言),DCL(数据库控制语言)
  4. C#操作word文档(二)
  5. 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表
  6. java在线预览txt、word、ppt、execel,pdf代码
  7. java 读取webapp文件_在Java Webapp和Java Normal应用中读取公共外部属性文件
  8. linux proc文件 write的原子性,Linux命令之write调用的原子性
  9. 比较运算符(ComparisonOperator)
  10. paip.python错误解决4
  11. tim指定保存云服务器_腾讯 TIM 迎来重大版本更新 新增独立的云文件功能
  12. python 保存为tiff文件, 图像转tiff, tif文件添加投影
  13. SpringBoot+vue项目实战(一)
  14. windows云服务器,如何使用windows云服务器
  15. Windows CMD常用命令大全
  16. 联想笔记本电脑键盘按键映射替换
  17. windows下MySQL数据库如何移动到其它盘
  18. linux内核配置高精度时钟,关于linux内核中使用的时钟
  19. RFID技术如何解决鞋帽行业应用
  20. 洛谷——P2862 [USACO06JAN]把牛Corral the Cows

热门文章

  1. laser_filters无效雷达数据屏蔽
  2. Java面向对象高阶
  3. 怎么找小红书达人推广?小红书达人推广方式有哪些_云媒易
  4. C#与SQl数据的对应关系(tinyint、smallint、int、bigint)
  5. 正则表达式(含范例)
  6. [jzoj 6305] 最小值 {单调栈}
  7. C语言:sizeof()和countof()
  8. 颜色类中英文词汇大全(2)
  9. ssh报user not allowed because account is locked错误
  10. 在农业银行做开发是什么样的体验?