`
234390216
  • 浏览: 10229811 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462459
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775244
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398176
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394947
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679877
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530770
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183578
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467457
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151277
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68022
社区版块
存档分类
最新评论

Ehcache(06)——监听器

阅读更多

监听器

 

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

 

1       CacheManager监听器

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

public interface CacheManagerEventListener {
 
    void init() throws CacheException;
 
    Status getStatus();
 
    void dispose() throws CacheException;
 
    void notifyCacheAdded(String cacheName);
 
    void notifyCacheRemoved(String cacheName);
 
}

 

 

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

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

l  dispose方法用于释放资源。

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

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

 

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

public abstract class CacheManagerEventListenerFactory {
 
    public abstract CacheManagerEventListener
            createCacheManagerEventListener(CacheManager cacheManager, Properties properties);
 
}

 

 

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

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

       cacheManagerEventListenerFactory元素可以指定三个属性:classpropertiespropertySeparator

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

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

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

 

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

       1、实现自己的CacheManagerEventListener

public class MyCacheManagerEventListener implements CacheManagerEventListener {
 
   private final CacheManager cacheManager;
  
   public MyCacheManagerEventListener(CacheManager cacheManager) {
      this.cacheManager = cacheManager;
   }
  
   @Override
   public void init() throws CacheException {
      System.out.println("init.....");
   }
 
   @Override
   public Status getStatus() {
      System.out.println("getStatus.....");
      returnnull;
   }
 
   @Override
   public void dispose() throws CacheException {
      System.out.println("dispose......");
   }
 
   @Override
   public void notifyCacheAdded(String cacheName) {
      System.out.println("cacheAdded......." + cacheName);
      System.out.println(cacheManager.getCache(cacheName));
   }
 
   @Override
   public void notifyCacheRemoved(String cacheName) {
      System.out.println("cacheRemoved......" + cacheName);
   }
 
}

 

 

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

public class MyCacheManagerEventListenerFactory extends
      CacheManagerEventListenerFactory {
 
   @Override
   public CacheManagerEventListener createCacheManagerEventListener(
         CacheManager cacheManager, Properties properties) {
      returnnew MyCacheManagerEventListener(cacheManager);
   }
 
}

 

 

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

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="100M">
 
   <diskStore path="d:\\ehcache" />
  
   <cacheManagerEventListenerFactory class="xxx.MyCacheManagerEventListenerFactory"/>
  
   <defaultCache/>
  
</ehcache>

 

 

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

   @Test
   public void testAdd() {
      CacheManager cacheManager = CacheManager.create(this.getClass().getResource("/ehcache-listener.xml"));
      cacheManager.addCache("test1");
      cacheManager.removeCache("test1");
   }

 

 

2       Cache监听器

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

public interface CacheEventListener extends Cloneable {
 
    void notifyElementRemoved(Ehcache cache, Element element) throws CacheException;
 
    void notifyElementPut(Ehcache cache, Element element) throws CacheException;
 
    void notifyElementUpdated(final Ehcache cache, final Element element) throws CacheException;
 
    void notifyElementExpired(final Ehcache cache, final Element element);
 
    void notifyElementEvicted(final Ehcache cache, final Element element);
 
    void notifyRemoveAll(final Ehcache cache);
 
    public Object clone() throws CloneNotSupportedException;
 
    void dispose();
}

 

 

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

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

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

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

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

l  notifyRemoveAll方法将在调用CacheremoveAll方法之后被调用。

dispose方法用于释放资源。

 

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

 

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

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

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

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

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

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

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

 

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

       1、实现一个CacheEventListener

public class MyCacheEventListener implements CacheEventListener {
 
   @Override
   public void notifyElementRemoved(Ehcache cache, Element element)
         throws CacheException {
      System.out.println("removed");
   }
 
   @Override
   public void notifyElementPut(Ehcache cache, Element element)
         throws CacheException {
      System.out.println("put");
   }
 
   @Override
   public void notifyElementUpdated(Ehcache cache, Element element)
         throws CacheException {
      System.out.println("updated");
   }
 
   @Override
   public void notifyElementExpired(Ehcache cache, Element element) {
      System.out.println("expired");
   }
 
   @Override
   public void notifyElementEvicted(Ehcache cache, Element element) {
      System.out.println("evicted");
   }
 
   @Override
   public void notifyRemoveAll(Ehcache cache) {
      System.out.println("removeAll");
   }
 
   @Override
   public void dispose() {
 
   }
  
   public Object clone() throws CloneNotSupportedException {
      thrownew CloneNotSupportedException();
   }
 
}

 

 

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

public class MyCacheEventListenerFactory extends CacheEventListenerFactory {
 
   @Override
   public CacheEventListener createCacheEventListener(Properties properties) {
      returnnew MyCacheEventListener();
   }
 
}

 

 

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

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
   maxBytesLocalHeap="100M">
 
   <diskStore path="d:\\ehcache" />
  
   <cache name="test">
      <cacheEventListenerFactory class="xxx.xxx.MyCacheEventListenerFactory"/>
   </cache>
  
   <defaultCache/>
  
</ehcache>

 

 

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

 

 

 

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

3
0
分享到:
评论
6 楼 冲出银河系 2017-05-04  
你好。我用这种方式添加监听,但是对多个服务器之间不能同步缓存了,这是怎么回事啊
5 楼 a87604476 2016-02-14  
testAdd()方法中直接addCache("test1")不会报错吗?
4 楼 aone 2015-05-07  
ehcache需要配置成分布式的,即要配置<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />,这样的话,是不是就不能自己再配置另外一个CacheEventListener了。

我想写一个LoggingCacheEventListener来记录缓存对象的修改日志,但发现已经没有地方配置自己的EventListenerFactory了。

盼回复
3 楼 freezingsky 2015-04-06  
cqian59420 写道
如果db某些数据改掉,cache能不能感知到

应该取决你的使用方式,而且cache本身就不应该去感知DB的变化!
2 楼 cqian59420 2015-03-31  
如果db某些数据改掉,cache能不能感知到
1 楼 di1984HIT 2014-10-30  
写的很好,学习了~~~

相关推荐

    Ehcache 简单的监控

    上述配置会启用RMI事件监听器,提供统计信息。 标签中的“源码”提示我们,Ehcache的源代码也是学习和调试的重要资源。通过阅读源码,我们可以深入了解其内部工作流程,如缓存的加载、替换策略、同步机制等。对于...

    ehcache缓存对象

    **标题解析:** "ehcache缓存对象" 这个标题指的是Ehcache这个缓存系统中的核心元素——缓存对象。Ehcache是Java中广泛使用的开源缓存框架,它能够有效地存储和检索数据,以提高应用程序的性能。这里的“缓存对象”...

    ehcache1.8.0

    5. **缓存监听器**:允许开发者定义缓存事件监听器,如添加、更新、移除等操作,可以实现自定义业务逻辑。 6. **缓存复制**:在分布式环境下,Ehcache可以实现缓存的自动复制,保证数据的一致性。 二、Ehcache配置...

    缓存技术详解

    ### 缓存技术详解——基于Ehcache开源框架的关键知识点 #### 一、Ehcache简介及背景 Ehcache是一种高性能、易于使用的开源缓存框架,最初与Hibernate项目紧密相关,随后发展成为独立的缓存解决方案。它旨在提供一...

    ehcachememcacheredis三大缓存男高音.pdf

    Ehcache 支持内存和硬盘存储,提供了多种淘汰策略,并且易于扩展,支持缓存监听器,便于统计和数据一致性维护。 - **使用**:通过简单的 API 和 XML 配置文件(如 ehcache.xml)即可快速搭建和管理缓存。配置属性...

    hibernate3.zip

    8. **事件监听器**:Hibernate3允许注册事件监听器,如PreInsertEventListener、PreUpdateEventListener等,监听对象的生命周期事件,实现业务逻辑的扩展。 9. **实体生命周期**:Hibernate3定义了实体的生命周期,...

    hibernate-3.2.5 java doc

    8. **实体监听器**:实体监听器允许我们在特定的生命周期事件(如加载、保存、更新或删除)上执行自定义逻辑。通过实现Hibernate的事件监听接口,我们可以扩展框架的行为。 综上所述,Hibernate 3.2.5的Java Docs是...

    hibernate-3.2.0.ga

    10. **事件监听器**:Hibernate 3.2.0.ga支持事件监听机制,可以通过监听器实现一些自定义行为,如对象的保存、更新、删除前后的行为。 11. **懒加载和即时加载**:Hibernate提供了懒加载机制,允许延迟加载关联的...

    Hibernate电子书.rar

    9. Advanced Topics:可能包括懒加载、级联操作、事件监听器、实体生命周期方法等进阶主题,帮助读者应对更复杂的业务场景。 10. 性能优化:提供一些最佳实践,如批处理、延迟加载优化、避免N+1查询问题等,以提升...

    hibernate-3.2.6下载

    6. 可扩展性:允许开发者通过插件机制自定义行为,如实体监听器、类型转换器等。 7. 性能优化:包括更有效的缓存策略、延迟加载优化等,提升了整体性能。 在实际开发中,理解并熟练使用Hibernate 3.2.6的关键在于...

    Hibernate开发资料

    9. **高级特性**:可能包含事件监听器、查询优化、动态模型、 Criteria API的复杂查询、子查询、集合操作等进阶主题。 10. **案例实战**:提供实际项目中的示例,演示如何在SSH(Spring、Struts、Hibernate)框架下...

    Hibernate参考文档

    12. **事件监听器** Hibernate允许注册事件监听器,监听对象的生命周期事件,如加载、保存、更新和删除。这可以用于实现复杂的业务逻辑或扩展功能。 13. **元数据获取** 通过Reflections API,开发者可以动态获取...

    Hibernate 孙卫琴 源码

    源码中,Session的实现涉及了事务管理、缓存机制,以及对Hibernate事件监听器的支持。 3. Criteria API与HQL:这两者是Hibernate的查询方式,它们的执行流程在源码中有着详细的实现,包括解析查询语句、生成SQL、...

    hibernate_PPT 教程

    最后,本教程可能还会涉及Hibernate的其他高级特性,如延迟加载(Lazy Loading)、级联操作(Cascade)、过滤器(Filters)和事件监听器(Listeners)等,这些都是在实际开发中非常实用的功能。 总的来说,这份...

    Hibernate 中文文档

    7. **其他高级特性**:这可能包括CGLIB和JPA支持、事件监听器、类型系统、元数据获取等进阶话题。 8. **示例与实战**:为了帮助读者更好地理解和应用,文档通常会包含丰富的实例代码,演示如何创建实体、配置映射、...

    孙卫琴hibernate sourcecode netstore源码

    5. **事件监听机制**:NetStore中如何利用Hibernate的事件监听器进行扩展,如对象的生命周期回调,提供了自定义业务逻辑的入口。 6. **元数据信息**:NetStore是如何读取和处理Hibernate的配置文件,获取对象-表...

    最经典的hibernate教程_从入门到精通

    最后,我们还会学习如何使用Hibernate的拦截器(Interceptor)和事件监听器(EventListener),它们允许我们在特定操作前后执行自定义逻辑,如记录日志或实现自定义验证。 总的来说,这个“最经典的Hibernate教程_...

    最经典的hibernate教程_从入门到精通_第四篇

    11. **事件监听器**:学习如何利用Hibernate的事件监听机制,自定义逻辑,如在对象保存、更新、删除前后的处理。 12. ** Hibenate与Spring整合**:了解如何将Hibernate与Spring框架整合,实现事务的声明式管理,...

    HberNate.jar

    通过HberNate.jar中的源码,我们可以深入理解Hibernate的内部工作原理,例如对象的状态转换、查询优化、事件监听器等。动手实践,结合源码阅读,将使你对Hibernate的理解达到一个新的高度。 总结,学习Hibernate不...

Global site tag (gtag.js) - Google Analytics