Ehcache——监听器

转载 2015年07月07日 11:29:33

监听器

 

       Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在Ehcache中,Listener是通过对应的监听器工厂来生产和发生作用的。下面我们将来介绍一下这两种类型的监听器。

 

1       CacheManager监听器

       Ehcache中定义了一个CacheManagerEventListener接口来监听CacheManager的事件。CacheManagerEventListener可以监听的事件有CacheManager添加和移除Cache。其中定义有如下五个方法:

Java代码  收藏代码
  1. public interface CacheManagerEventListener {  
  2.    
  3.     void init() throws CacheException;  
  4.    
  5.     Status getStatus();  
  6.    
  7.     void dispose() throws CacheException;  
  8.    
  9.     void notifyCacheAdded(String cacheName);  
  10.    
  11.     void notifyCacheRemoved(String cacheName);  
  12.    
  13. }  

 

 

init方法会在CacheManagerEventListener实现类实例化后被调用,用于初始化CacheManagerEventListener。

getStatus方法返回当前CacheManagerEventListener所处的状态,可选值有STATUS_UNINITIALISEDSTATUS_ALIVESTATUS_SHUTDOWN

dispose方法用于释放资源。

notifyCacheAdded方法会在往CacheManager中添加Cache时被调用。

notifyCacheRemoved方法会在从CacheManager中移除Cache时被调用。

 

       Ehcache是通过CacheManagerEventListenerFactory来获取当前CacheManager所使用的CacheManagerEventListener的。CacheManagerEventListenerFactory是一个抽象类,其定义如下:

Java代码  收藏代码
  1. public abstract class CacheManagerEventListenerFactory {  
  2.    
  3.     public abstract CacheManagerEventListener  
  4.             createCacheManagerEventListener(CacheManager cacheManager, Properties properties);  
  5.    
  6. }  

 

 

       在我们自己的CacheManagerEventListenerFactory子类中需要实现其抽象方法createCacheManagerEventListener,在生成对应的CacheManagerEventListener进行返回时我们可以使用当前的CacheManager以及在ehcache.xml文件中定义CacheManagerEventListenerFactory时指定的属性Properties。通过CacheManagerEventListenerFactory我们可以实现为不同的CacheManager使用不同的CacheManagerEventListener。

       有了CacheManagerEventListener和CacheManagerEventListenerFactory之后,我们需要在对应的ehcache.xml文件中通过cacheManagerEventListenerFactory元素来指定当前ehcache.xml文件对应的CacheManager所使用的事件监听器工厂,每一个ehcache.xml文件中最多只能指定一个cacheManagerEventListenerFactory元素。

       cacheManagerEventListenerFactory元素可以指定三个属性:class、properties和propertySeparator。

class属性必须指定,表示对应的CacheManagerEventListenerFactory实现类全名。

properties属性可选,用来指定CacheManagerEventListenerFactory在创建CacheManagerEventListener时需要使用的属性,里面是键值对的形式,多个属性之间默认用逗号隔开。如“prop1=val1,prop2=val2”。

propertySeparator属性可选,用来指定properties属性之间的分隔符。

 

       下面给一个监听CacheManager事件的示例。

       1、实现自己的CacheManagerEventListener。

Java代码  收藏代码
  1. public class MyCacheManagerEventListener implements CacheManagerEventListener {  
  2.    
  3.    private final CacheManager cacheManager;  
  4.     
  5.    public MyCacheManagerEventListener(CacheManager cacheManager) {  
  6.       this.cacheManager = cacheManager;  
  7.    }  
  8.     
  9.    @Override  
  10.    public void init() throws CacheException {  
  11.       System.out.println("init.....");  
  12.    }  
  13.    
  14.    @Override  
  15.    public Status getStatus() {  
  16.       System.out.println("getStatus.....");  
  17.       returnnull;  
  18.    }  
  19.    
  20.    @Override  
  21.    public void dispose() throws CacheException {  
  22.       System.out.println("dispose......");  
  23.    }  
  24.    
  25.    @Override  
  26.    public void notifyCacheAdded(String cacheName) {  
  27.       System.out.println("cacheAdded......." + cacheName);  
  28.       System.out.println(cacheManager.getCache(cacheName));  
  29.    }  
  30.    
  31.    @Override  
  32.    public void notifyCacheRemoved(String cacheName) {  
  33.       System.out.println("cacheRemoved......" + cacheName);  
  34.    }  
  35.    
  36. }  

 

 

       2、实现自己的CacheManagerEventListenerFactory,根据条件创建对应的CacheManagerEventListener。

Java代码  收藏代码
  1. public class MyCacheManagerEventListenerFactory extends  
  2.       CacheManagerEventListenerFactory {  
  3.    
  4.    @Override  
  5.    public CacheManagerEventListener createCacheManagerEventListener(  
  6.          CacheManager cacheManager, Properties properties) {  
  7.       returnnew MyCacheManagerEventListener(cacheManager);  
  8.    }  
  9.    
  10. }  

 

 

       3、在ehcache.xml文件中通过cacheManagerEventListenerFactory元素指定当前CacheManager所使用的CacheManagerEventListenerFactory为我们自己定义的CacheManagerEventListenerFactory。

Xml代码  收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
  3.    maxBytesLocalHeap="100M">  
  4.    
  5.    <diskStore path="d:\\ehcache" />  
  6.     
  7.    <cacheManagerEventListenerFactory class="xxx.MyCacheManagerEventListenerFactory"/>  
  8.     
  9.    <defaultCache/>  
  10.     
  11. </ehcache>  

 

 

       针对于上述监听器所进行的测试代码如下所示:

Java代码  收藏代码
  1. @Test  
  2. public void testAdd() {  
  3.    CacheManager cacheManager = CacheManager.create(this.getClass().getResource("/ehcache-listener.xml"));  
  4.    cacheManager.addCache("test1");  
  5.    cacheManager.removeCache("test1");  
  6. }  

 

 

2       Cache监听器

       Ehcache中定义了一个CacheEventListener接口来监听Cache的事件。其能监听到Cache中元素的添加、删除、更新等。CacheEventListener中主要定义有以下方法:

Java代码  收藏代码
  1. public interface CacheEventListener extends Cloneable {  
  2.    
  3.     void notifyElementRemoved(Ehcache cache, Element element) throws CacheException;  
  4.    
  5.     void notifyElementPut(Ehcache cache, Element element) throws CacheException;  
  6.    
  7.     void notifyElementUpdated(final Ehcache cache, final Element element) throws CacheException;  
  8.    
  9.     void notifyElementExpired(final Ehcache cache, final Element element);  
  10.    
  11.     void notifyElementEvicted(final Ehcache cache, final Element element);  
  12.    
  13.     void notifyRemoveAll(final Ehcache cache);  
  14.    
  15.     public Object clone() throws CloneNotSupportedException;  
  16.    
  17.     void dispose();  
  18. }  

 

 

notifyElementRemoved方法会在往Cache中移除单个元素时被调用,即在调用Cache的remove方法之后被调用。

notifyElementPut方法会在往Cache中添加元素时被调用。调用Cache的put方法添加元素时会被阻塞,直到对应的notifyElementPut方法返回之后。

notifyElementUpdated方法,当往Cache中put一个已经存在的元素时就会触发CacheEventListener的notifyElementUpdated方法,此时put操作也会处于阻塞状态,直到notifyElementUpdated方法执行完毕。

notifyElementExpired方法,当Ehcache检测到Cache中有元素已经过期的时候将调用notifyElementExpired方法。

notifyElementEvicted方法将会在元素被驱除的时候调用。

notifyRemoveAll方法将在调用Cache的removeAll方法之后被调用。

dispose方法用于释放资源。

 

       那我们在实现自己的CacheEventListener时就需要实现上述所有的方法。Ehcache为我们提供了一个默认的空实现CacheEventListenerAdapter,我们可以在实际应用中继承CacheEventListenerAdapter,然后重写其中的某些方法,以简化我们对CacheEventListener的实现。

 

       跟CacheManagerEventListener一样,CacheEventListener不能单独起作用,它需要通过当前Cache相关联的CacheEventListenerFactory来构建一个当前Cache使用的CacheEventListener。CacheEventListenerFactory是一个抽象类,其中只定义了一个createCacheEventListener方法,该方法接收一个Properties对象作为参数。

       在ehcahce.xml文件中通过cache元素下的子元素cacheEventListenerFactory可以指定当前Cache所使用的CacheEventListenerFactory。其可以指定四个属性:

class:指定当前CacheEventListenerFactory对应的Java类全名称。

properties:指定在构建CacheEventListenerFactory时需传入的属性键值对,多个属性之间默认用逗号分开,如:“prop1=value1,prop2=value2”。

propertySeparator:指定properties中多个属性之间的分隔符。

listenFor:表示在集群环境下可以监听到的Cache事件的范围,可选值有local、remote和all。local代表只监听本节点的Cache事件,remote代表只监听其他节点的Cache事件,all代表监听所有的Cache事件。默认是all。

       与CacheManagerEventListenerFactory不同的是一个Cache可以定义多个CacheEventListenerFactory。

 

       下面来看一个使用Cache监听器的例子。

       1、实现一个CacheEventListener。

Java代码  收藏代码
  1. public class MyCacheEventListener implements CacheEventListener {  
  2.    
  3.    @Override  
  4.    public void notifyElementRemoved(Ehcache cache, Element element)  
  5.          throws CacheException {  
  6.       System.out.println("removed");  
  7.    }  
  8.    
  9.    @Override  
  10.    public void notifyElementPut(Ehcache cache, Element element)  
  11.          throws CacheException {  
  12.       System.out.println("put");  
  13.    }  
  14.    
  15.    @Override  
  16.    public void notifyElementUpdated(Ehcache cache, Element element)  
  17.          throws CacheException {  
  18.       System.out.println("updated");  
  19.    }  
  20.    
  21.    @Override  
  22.    public void notifyElementExpired(Ehcache cache, Element element) {  
  23.       System.out.println("expired");  
  24.    }  
  25.    
  26.    @Override  
  27.    public void notifyElementEvicted(Ehcache cache, Element element) {  
  28.       System.out.println("evicted");  
  29.    }  
  30.    
  31.    @Override  
  32.    public void notifyRemoveAll(Ehcache cache) {  
  33.       System.out.println("removeAll");  
  34.    }  
  35.    
  36.    @Override  
  37.    public void dispose() {  
  38.    
  39.    }  
  40.     
  41.    public Object clone() throws CloneNotSupportedException {  
  42.       thrownew CloneNotSupportedException();  
  43.    }  
  44.    
  45. }  

 

 

       2、实现抽象工厂类CacheEventListenerFactory来生产前面已经定义好的CacheEventListener。

Java代码  收藏代码
  1. public class MyCacheEventListenerFactory extends CacheEventListenerFactory {  
  2.    
  3.    @Override  
  4.    public CacheEventListener createCacheEventListener(Properties properties) {  
  5.       returnnew MyCacheEventListener();  
  6.    }  
  7.    
  8. }  

 

 

       3、在ehcache.xml文件中通过cache元素的子元素cacheEventListenerFactory来指定当前Cache使用的CacheEventListenerFactory。

Xml代码  收藏代码
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
  3.    maxBytesLocalHeap="100M">  
  4.    
  5.    <diskStore path="d:\\ehcache" />  
  6.     
  7.    <cache name="test">  
  8.       <cacheEventListenerFactory class="xxx.xxx.MyCacheEventListenerFactory"/>  
  9.    </cache>  
  10.     
  11.    <defaultCache/>  
  12.     
  13. </ehcache>  

 

 

       经过以上三步我们就完成了对Cache事件的监听。

 

 

 

(注:本文是基于ehcache2.8.1所写)

相关文章推荐

Spring自定义缓存管理及配置Ehcache缓存

Spring自带缓存、自建缓存管理器等都可解决项目部分性能问题。结合Ehcache后性能更优,使用也比较简单。 在进行Ehcache学习之前,最好对Spring自带的缓存管理有一个总体的认识。 ...

Spring与Ehcache简单自定义监听器配置

一、简介 EhCache 是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘两级缓存,支持LRU、LFU和FIFO多种淘汰算法,支持通过rmi,jgroup,jms实现分...

自定义ehcache的key

今天在项目中用到了ehcache缓存,将list缓存到ehcache中,但是又存在分页问题,会传入Page类,默认的key命名方式失效,网上资料比较少,总结代码贴上来。   spring整...

Ehcache(06)——监听器

监听器          Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在E...

ehcache监听器的用法

EhCache event listener for preventing caching of null values in data store(ehcache监听器,坚挺value为null时清...

Ehcache(06)——监听器

监听器          Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在E...
  • zylzb
  • zylzb
  • 2014年10月27日 17:40
  • 519

SQL Server 查询处理中的各个阶段(SQL执行顺序)

出处:http://blog.itpub.net/22943950/viewspace-1117920/ SQL Server 查询处理中的各个阶段(SQL执行顺序) SQL不同于...

jdbc的con、pstmt、rs的非正常关闭顺序探讨

首先大家都知道,正常的关闭顺序都是ResultSet、PreparedStatement、Connection的顺序,这里就不作讨论了 Connection:与特定数据库的连接(会话)。 Prep...

Spring与Ehcache简单自定义监听器配置

目录[-] 一、简介二、应用场景三、简单实现方式四、其他主流缓存框架一览 一、简介 EhCache 是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘两级缓存...

java监听器 EhCache 2.2.0 发布了

每种语言都有自己回调的方法,java也不例外.   Java的回调是采用多态的方式来回调.比如:     interface MouseListener {   //当click方法被调...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ehcache——监听器
举报原因:
原因补充:

(最多只允许输入30个字)