概述

缓存的使用可以加快平台的运行速度,对于一些经常需要读取的信息,包括结构化的信息需要进行缓存。在流程模块中,因为流程定义其设计也存储是基于XML的,但在流程执行过程中,其定义是会转成一个JAVA的结构化数据,为了兼容其运行效率,我们对其流程定义的解析后的对象进行了缓存管理。当流程定义发生了变更时,还需要重新从缓存池中删除该流程定义的对象的缓存。

实现机制

平台使用redis的缓存机制,即通过流程定义前缀+defId进行缓存。

修改Activiti的缓存机制,在ActivitiConfig.java文件,增加以下配置:

  1. //修改其流程缓存
  2. conf.setProcessDefinitionCache(new FlowDefCache());

FlowCache的实现如下:

  1. package com.redxun.bpm.activiti.ext;
  2. import com.redxun.bpm.core.service.ConfigCacheUtil;
  3. import com.redxun.cache.CacheUtil;
  4. import lombok.SneakyThrows;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.activiti.engine.impl.persistence.deploy.DeploymentCache;
  7. /**
  8. * 流程定义缓存。
  9. *
  10. * @author ray
  11. */
  12. @Slf4j
  13. public class FlowDefCache implements DeploymentCache {
  14. private static final String REGION="bpm";
  15. @SneakyThrows
  16. @Override
  17. public Object get(String key) {
  18. if(!this.contains(key)){
  19. return null;
  20. }
  21. Object o=CacheUtil.get(REGION,key);
  22. return o;
  23. }
  24. @Override
  25. public boolean contains(String key) {
  26. return CacheUtil.isExist(REGION,key);
  27. }
  28. @SneakyThrows
  29. @Override
  30. public void add(String key, Object o) {
  31. CacheUtil.set(REGION,key,o);
  32. }
  33. @Override
  34. public void remove(String key) {
  35. CacheUtil.get(REGION,key);
  36. }
  37. @Override
  38. public void clear() {
  39. CacheUtil.clear(REGION);
  40. }
  41. /**
  42. * 将流程定义从缓存删除。
  43. * @param actDefId
  44. */
  45. public static void removeByDefId(String actDefId){
  46. CacheUtil.remove(REGION,actDefId);
  47. ConfigCacheUtil.remove(actDefId);
  48. }
  49. }

实现以上配置后,在流程很多地方中使用到获取流程节点等信息时,其会优先从缓存池里获取,若没有才会解析并且放置缓存中。

  1. BpmnModel bpmnModel=repositoryService.getBpmnModel(actDefId);

流程扩展配置缓存

参考 BpmDefService类的实现,如获取流程定义的全局节点的配置或某个节点的节点配置:

  1. /**
  2. * 根据流程定义ID获取
  3. * @param actDefId
  4. * @return
  5. */
  6. public ProcessConfig getProcessConfig(String actDefId){
  7. if(StringUtils.isEmpty(actDefId)){
  8. return null;
  9. }
  10. Map<String,NodeConfig> mapConfig=getConfigByActDefId(actDefId);
  11. for (NodeConfig entry:mapConfig.values()){
  12. if(entry instanceof ProcessConfig){
  13. return (ProcessConfig) entry;
  14. }
  15. }
  16. return null;
  17. }
  18. /**
  19. * 根据流程定义获取节点定义。
  20. * @param actDefId
  21. * @return
  22. */
  23. public Map<String,NodeConfig> getConfigByActDefId(String actDefId){
  24. Map<String,NodeConfig> mapConfig=ConfigCacheUtil.getCache(actDefId);
  25. if(BeanUtil.isNotEmpty(mapConfig)){
  26. return mapConfig;
  27. }
  28. BpmDef bpmDef=getByActDefId(actDefId);
  29. mapConfig=getNodeConfigs(bpmDef.getExtConfs());
  30. ConfigCacheUtil.add(actDefId,mapConfig);
  31. return mapConfig;
  32. }

缓存工具实现

该工具主要实现对redis的缓存读写的处理,如下实现所示:

  1. package com.redxun.bpm.core.service;
  2. import com.redxun.bpm.activiti.config.NodeConfig;
  3. import com.redxun.cache.CacheUtil;
  4. import com.redxun.dto.bpm.BpmConst;
  5. import java.util.Map;
  6. /**
  7. * 流程配置缓存。
  8. */
  9. public class ConfigCacheUtil {
  10. private static String getKey(String actDefId){
  11. return BpmConst.TYPE_CONFIG + actDefId;
  12. }
  13. /**
  14. * 获取缓存。
  15. * @param actDefId
  16. * @return
  17. */
  18. public static Map<String, NodeConfig> getCache(String actDefId){
  19. String key=getKey(actDefId);
  20. return (Map<String, NodeConfig>)CacheUtil.get(BpmConst.CACHE_REGION,key);
  21. }
  22. /**
  23. * 删除
  24. * @param actDefId
  25. */
  26. public static void remove(String actDefId){
  27. String key=getKey(actDefId);
  28. CacheUtil.remove(BpmConst.CACHE_REGION,key);
  29. }
  30. /**
  31. * 添加缓存。
  32. * @param actDefId
  33. * @param configMap
  34. */
  35. public static void add(String actDefId,Map<String, NodeConfig> configMap){
  36. String key=getKey(actDefId);
  37. CacheUtil.set(BpmConst.CACHE_REGION,key,configMap);
  38. }
  39. }
  1. package com.redxun.cache;
  2. import com.redxun.common.utils.SpringUtil;
  3. public class CacheUtil {
  4. public CacheUtil() {
  5. }
  6. public static ICache getCache() {
  7. return (ICache)SpringUtil.getBean(ICache.class);
  8. }
  9. public static void set(String region, String key, Object obj) {
  10. ICache cache = getCache();
  11. cache.set(region, key, obj);
  12. }
  13. public static Object get(String region, String key) {
  14. ICache cache = getCache();
  15. return cache.get(region, key);
  16. }
  17. public static void remove(String region, String key) {
  18. ICache cache = getCache();
  19. cache.remove(region, key);
  20. }
  21. public static void clear(String region) {
  22. ICache cache = getCache();
  23. cache.clear(region);
  24. }
  25. public static boolean isExist(String region, String key) {
  26. ICache cache = getCache();
  27. return cache.isExist(region, key);
  28. }
  29. }
文档更新时间: 2020-10-12 09:25   作者:csx