監聽器
Ehcache中監聽器有兩種,監聽CacheManager的CacheManagerEventListener和監聽Cache的CacheEventListener。在Ehcache中,Listener是通過對應的監聽器工廠來生産和發生作用的。下面我們将來介紹一下這兩種類型的監聽器。
Ehcache中定義了一個CacheManagerEventListener接口來監聽CacheManager的事件。CacheManagerEventListener可以監聽的事件有CacheManager添加和移除Cache。其中定義有如下五個方法:
l init方法會在CacheManagerEventListener實作類執行個體化後被調用,用于初始化CacheManagerEventListener。
l getStatus方法傳回目前CacheManagerEventListener所處的狀态,可選值有STATUS_UNINITIALISED、 STATUS_ALIVE和STATUS_SHUTDOWN。
l dispose方法用于釋放資源。
l notifyCacheAdded方法會在往CacheManager中添加Cache時被調用。
l notifyCacheRemoved方法會在從CacheManager中移除Cache時被調用。
Ehcache是通過CacheManagerEventListenerFactory來擷取目前CacheManager所使用的CacheManagerEventListener的。CacheManagerEventListenerFactory是一個抽象類,其定義如下:
在我們自己的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。
l class屬性必須指定,表示對應的CacheManagerEventListenerFactory實作類全名。
l properties屬性可選,用來指定CacheManagerEventListenerFactory在建立CacheManagerEventListener時需要使用的屬性,裡面是鍵值對的形式,多個屬性之間預設用逗号隔開。如“prop1=val1,prop2=val2”。
l propertySeparator屬性可選,用來指定properties屬性之間的分隔符。
下面給一個監聽CacheManager事件的示例。
1、實作自己的CacheManagerEventListener。
2、實作自己的CacheManagerEventListenerFactory,根據條件建立對應的CacheManagerEventListener。
3、在ehcache.xml檔案中通過cacheManagerEventListenerFactory元素指定目前CacheManager所使用的CacheManagerEventListenerFactory為我們自己定義的CacheManagerEventListenerFactory。
針對于上述監聽器所進行的測試代碼如下所示:
Ehcache中定義了一個CacheEventListener接口來監聽Cache的事件。其能監聽到Cache中元素的添加、删除、更新等。CacheEventListener中主要定義有以下方法:
l notifyElementRemoved方法會在往Cache中移除單個元素時被調用,即在調用Cache的remove方法之後被調用。
l notifyElementPut方法會在往Cache中添加元素時被調用。調用Cache的put方法添加元素時會被阻塞,直到對應的notifyElementPut方法傳回之後。
l notifyElementUpdated方法,當往Cache中put一個已經存在的元素時就會觸發CacheEventListener的notifyElementUpdated方法,此時put操作也會處于阻塞狀态,直到notifyElementUpdated方法執行完畢。
l notifyElementExpired方法,當Ehcache檢測到Cache中有元素已經過期的時候将調用notifyElementExpired方法。
l notifyElementEvicted方法将會在元素被驅除的時候調用。
l notifyRemoveAll方法将在調用Cache的removeAll方法之後被調用。
dispose方法用于釋放資源。
那我們在實作自己的CacheEventListener時就需要實作上述所有的方法。Ehcache為我們提供了一個預設的空實作CacheEventListenerAdapter,我們可以在實際應用中繼承CacheEventListenerAdapter,然後重寫其中的某些方法,以簡化我們對CacheEventListener的實作。
跟CacheManagerEventListener一樣,CacheEventListener不能單獨起作用,它需要通過目前Cache相關聯的CacheEventListenerFactory來建構一個目前Cache使用的CacheEventListener。CacheEventListenerFactory是一個抽象類,其中隻定義了一個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事件的範圍,可選值有local、remote和all。local代表隻監聽本節點的Cache事件,remote代表隻監聽其他節點的Cache事件,all代表監聽所有的Cache事件。預設是all。
與CacheManagerEventListenerFactory不同的是一個Cache可以定義多個CacheEventListenerFactory。
下面來看一個使用Cache監聽器的例子。
1、實作一個CacheEventListener。
2、實作抽象工廠類CacheEventListenerFactory來生産前面已經定義好的CacheEventListener。
3、在ehcache.xml檔案中通過cache元素的子元素cacheEventListenerFactory來指定目前Cache使用的CacheEventListenerFactory。
經過以上三步我們就完成了對Cache事件的監聽。
(注:本文是基于ehcache2.8.1所寫)