Activiti流程定义缓存源码分析4-缓存使用redis

      摘要:activiti缓存使用redis与flowable使用redis存储缓存道理一样,本文以activiti使用redis作为缓存介质为例进行说明。关于其他工作流引擎使用reids缓存流程定义也可以参考本文。

上面我们详细分析了关于DefaultDeploymentCache类的架构以及其处理逻辑,因为该类内部持有Map进行数据的缓存操作。对于客户端使用者而言,缓存数据的获取、添加以及更新操作有点不方便而且不灵活,比如系统重启或者宕机则会引起缓存数据丢失,所以在实际的开发环境中,我们通常使用Redis或者Memcached框架进行缓存数据的统一管理工作,附带的好处就是可以将缓存系统与项目解耦,并且可以通过以上这些框架提供的图形化管理工具对缓存数据进行维护(比如更新或者删除),从而可以对缓存数据进行统一管理。当然了只要你喜欢,也可以使用比较“原始”的telent命令进行缓存数据的操作。由于Redis框架支持数据持久化功能,在这里我们使用Redis框架对流程定义实体对象进行缓存。关于bpmnModelCache以及knowledgeBaseCache对象的缓存读者可以结合该案例进行实现。在java中我们通常使用Jedis类库操作Redis实例,首先我们需要获取到Jedis的程序包,在这里笔者使用的Jedis程序包版本为jedis.2.8.1,关于Redis以及Jedis的更多知识点,读者可以参考相关资料进行学习。接下来,我们自定义一个缓存类,从而实现对流程定义实体实例对象的缓存操作。该类相关定义如代码清单x-所示。

代码清单x-ShareniuProcessDefinitionCache.java

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

public class ShareniuProcessDefinitionCache implements DeploymentCache<ProcessDefinitionEntity> {

 //实例化Jedis ip:端口

Jedis jedis = new Jedis("localhost",6379); #-1

public ProcessDefinitionEntity get(String id) { #-2

//获取数据

byte[] bs = jedis.get(id.getBytes());

if (bs==null)return null;

//将二进制数据转换为ProcessDefinitionEntity对象

Object object = toObject(bs);

if (object==null)return null;

ProcessDefinitionEntity pdf=(ProcessDefinitionEntity) object;

return pdf;

}

public void add(String id, ProcessDefinitionEntity object) { #-3

//添加到缓存,因为value为object对象,所以需要将该对象转化为二进制进行存储

jedis.set(id.getBytes(), toByteArray(object));

}

public void remove(String id) {

//删除制定的key

jedis.del(id.getBytes());

}

public void clear() { #-4

//清除所有的数据,在这里默认不提供实现,避免误操作

}

 public static byte[] toByteArray (Object obj) {      #-5

        byte[] bytes = null;     

        ByteArrayOutputStream bos = new ByteArrayOutputStream();     

        try {       

            ObjectOutputStream oos = new ObjectOutputStream(bos);        

            oos.writeObject(obj);       

            oos.flush();        

            bytes = bos.toByteArray ();     

            oos.close();        

            bos.close();       

        } catch (IOException ex) {       

        }     

        return bytes;   

    }  

    public static Object toObject (byte[] bytes) {    #-6  

        Object obj = null;     

        try {       

            ByteArrayInputStream bis = new ByteArrayInputStream (bytes);       

            ObjectInputStream ois = new ObjectInputStream (bis);       

            obj = ois.readObject();     

            ois.close();  

            bis.close();  

        } catch (Exception ex) {       

        }   

        return obj;   

    }  

}

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

上面代码的实现逻辑非常清晰,首先定义ShareniuProcessDefinitionCache类并实现和重写DeploymentCache接口中的函数,需要说明一点:我们使用Redis键值对方式进行缓存数据的操作,存储的键为流程定义的id值,值为流程定义实体实例对象,由于Redis的键和值都支持使用二进制字符串,因此存储Java对象不是问题,前提是必须对Java对象(需要实现Serializable接口)进行序列化如#-5 所示和反序列化操作#-6所示。#-1中实例化Jedis类并通过该实例对象操作Redis。#-2中的get函数客户端使用者必须进行实现,之前的章节中我们知道流程文档部署完毕之后会通过该函数获取缓存值,以确保对象被成功缓存下来,如果该函数中没有提供相应的实现,则流程部署操作肯定会直接报错。该函数的处理逻辑非常简单,首先根据参数id值从Redis中获取值,然后将获取到的值转化为ProcessDefinitionEntity实例对象并返回。#-3函数根据参数值添加缓存操作(因为DeploymentCache接口中没有定义对单条数据的删除以及更新函数,因此可以在这里实现数据的更新或者删除逻辑,当然了也可以直接操作Redis进行数据的更新或者删除)。#-4中的清除缓存函数,我们不提供实现,以防止客户端误操作造成缓存雪崩。上面案例中我们使用键值对的方式进行缓存数据的操作,读者有兴趣可以使用Redis框架中提供的其它数据结构进行操作,比如List。

      1. 注入引擎

上面我们自定义了ShareniuProcessDefinitionCache类,现在我们需要做的工作就是将该类注入流程引擎配置类以替换其默认实现,该类注入引擎过程如代码清单x-所示。

代码清单x-ShareniuProcessDefinitionCache.java

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

activiti.cfg.xml

 <bean id="processEngineConfiguration"

         class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">   

<!--通过processDefinitionCache属性注入自定义的缓存类 -->

<propertyname="processDefinitionCache"ref="a"></property>

        </bean>

<beanid="a"class="com.shareniu.activiti.learing.ch14.ShareniuProcessDefinitionCache">

     </bean>

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

注入引擎的过程比较简单,直接通过processDefinitionCache属性进行自定义缓存类的注入即可。读者可以按照上述步骤,进行流程文档的部署操作,然后使用redis图形化工具进行缓存数据的查看。相信读者从中一定有所收获。

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

具体效果参考盘古BPM

 

 

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

猜你喜欢

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