本系列课程主要针对于Ehcache缓存框架功能的开发实践全流程技术指南!
Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在Ehcache中,Listener是通过对应的监听器工厂来生产和发生作用的。下面我们将来介绍一下这两种类型的监听器。
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);
}
init
方法在CacheManagerEventListener
实现类被实例化后调用,此方法负责初始化CacheManagerEventListener
。getStatus
方法返回CacheManagerEventListener
当前的状态。它的可能返回值包括:STATUS_UNINITIALISED
,对应未初始化状态;STATUS_ALIVE
,对应运行状态;以及STATUS_SHUTDOWN
,对应已关闭状态。dispose
方法负责释放CacheManagerEventListener
所使用的资源,这通常用于实例不再需要时的清理工作。CacheManager
添加Cache实例时,会调用notifyCacheAdded
方法。CacheManager
移除Cache实例时,会调用notifyCacheRemoved
方法。Ehcache是通过CacheManagerEventListenerFactory来获取当前CacheManager所使用的CacheManagerEventListener的。
CacheManagerEventListenerFactory是一个抽象类,其定义如下:
public abstract class CacheManagerEventListenerFactory {
public abstract CacheManagerEventListener
createCacheManagerEventListener(CacheManager cacheManager, Properties properties);
}
通过CacheManagerEventListenerFactory我们可以实现为不同的CacheManager使用不同的CacheManagerEventListener。
在CacheManagerEventListenerFactory子类中需要实现其抽象方法createCacheManagerEventListener,在生成对应的CacheManagerEventListener进行返回时我们可以使用当前的CacheManager以及在ehcache.xml文件中定义CacheManagerEventListenerFactory时指定的属性Properties。
cacheManagerEventListenerFactory元素可以指定三个属性:class、properties和propertySeparator。
class
:定义了cacheManagerEventListenerFactory
实现类的全类名。properties
:配合propertySeparator
一起使用,以指定通过字符串设定的属性值。propertySeparator
:设定properties
属性中使用的分隔符。cacheManagerEventListenerFactory元素可以指定三个属性:class、properties和propertySeparator。
CacheManagerEventListener和CacheManagerEventListenerFactory之后,需要在对应的ehcache.xml文件中通过cacheManagerEventListenerFactory元素来指定当前ehcache.xml文件对应的CacheManager所使用的事件监听器工厂,每一个ehcache.xml文件中最多只能指定一个cacheManagerEventListenerFactory元素。
下面给一个监听CacheManager事件的示例,实现自己的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);
}
}
实现自己的CacheManagerEventListenerFactory,根据条件创建对应的CacheManagerEventListener。
public class MyCacheManagerEventListenerFactory extends
CacheManagerEventListenerFactory {
@Override
public CacheManagerEventListener createCacheManagerEventListener(
CacheManager cacheManager, Properties properties) {
returnnew MyCacheManagerEventListener(cacheManager);
}
}
在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");
}
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();
}
那我们在实现自己的CacheEventListener时就需要实现上述所有的方法。Ehcache为我们提供了一个默认的空实现CacheEventListenerAdapter,我们可以在实际应用中继承CacheEventListenerAdapter,然后重写其中的某些方法,以简化我们对CacheEventListener的实现。
跟CacheManagerEventListener一样,CacheEventListener不能单独起作用,它需要通过当前Cache相关联的CacheEventListenerFactory来构建一个当前Cache使用的CacheEventListener。CacheEventListenerFactory是一个抽象类,其中只定义了一个createCacheEventListener方法,该方法接收一个Properties对象作为参数。
在ehance.xml文件中通过cache元素下的子元素cacheEventListenerFactory可以指定当前Cache所使用的CacheEventListenerFactory。其可以指定四个属性:
与CacheManagerEventListenerFactory不同的是一个Cache可以定义多个CacheEventListenerFactory。
下面来看一个使用Cache监听器的例子。
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();
}
}
实现抽象工厂类CacheEventListenerFactory来生产前面已经定义好的CacheEventListener。
public class MyCacheEventListenerFactory extends CacheEventListenerFactory {
@Override
public CacheEventListener createCacheEventListener(Properties properties) {
return new MyCacheEventListener();
}
}
在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事件的监听。