天天看點

EhCache實作OSGi緩存bundle

代碼擷取位址:我的github項目,mycodes/osgi_ehcache_bundle目錄

        本文以開源的ehcahe實作了一個簡單的通用緩存bundle。

        雖然之前我有幾篇部落格設計到了osgi架構,但是缺少一個詳細的介紹,是以關于osgi的相關資料,請參考連結 http://blog.csdn.net/abram163/article/details/2534646 裡面搜集的資料還是比較好的。

         在準備緩存bundle的時候,我簡單在網上搜了下java緩存的開源實作,見 http://www.open-open.com/13.htm 。其中ehcache是一個純java的過程中緩存實作hibernate2.1,spring都支援ehcache嵌入。這裡,我沒有用到hibernate或者spring等架構,而是在equinox這個osgi架構中直接嵌入ehcacheapi,提供出一個能調用put(key, value)和get(key)的服務bundle。當然,在測試的時候,你完全可以用純java的形式寫一下ehcache的工程,再進行少量重構,改寫成bundle形式。

         簡單介紹下ehcache吧。其實除了作為bundle,我還為我們軟體工程課上做論壇的組推薦用ehcache為熱門文章做緩存,因為ehcache很好上手。ehcache是純java的輕量級緩存,支援記憶體和硬碟緩存(在.xml配置),lfu,lru的緩存實作方式也隻要寫在配置檔案裡即可。他的整體結構如下:

cachemanager

cache                                          cache

element   element    element         element    element    element

以下是.xml具體配置,defaultcache是預設cache,.xml檔案允許使用者配置自己需要的不同cache

然後由配置好的.xml建立cachemanager,然後由cachemanager建立xml内的不同種類的cache,最後建立element(存着鍵值對)添加到相應的cache内,即完成了最簡單的get,put功能的緩存。比如:

對xml中配置參數的幾點說明:

·   cache配置

·           name:cache的唯一辨別

·           maxelementsinmemory:記憶體中最大緩存對象數。

·           maxelementsondisk:磁盤中最大緩存對象數,若是0表示無窮大。

·           eternal:element是否永久有效,一但設定了,timeout将不起作用。

·           overflowtodisk:配置此屬性,當記憶體中element數量達到maxelementsinmemory時,ehcache将會element寫到磁盤中。

·           timetoidleseconds:設定element在失效前的允許閑置時間。僅當element不是永久有效時使用,可選屬性,預設值是0,也就是可閑置時間無窮大。

·           timetoliveseconds:設定element在失效前允許存活時間。最大時間介于建立時間和失效時間之間。僅當element不是永久有效時使用,預設是0.,也就是element存活時間無窮大。

·           diskpersistent:是否緩存虛拟機重新開機期資料。(這個虛拟機是指什麼虛拟機一直沒看明白是什麼,有高人還希望能指點一二)。

·           diskexpirythreadintervalseconds:磁盤失效線程運作時間間隔,預設是120秒。

·           diskspoolbuffersizemb:這個參數設定diskstore(磁盤緩存)的緩存區大小。預設是30mb。每個cache都應該有自己的一個緩沖區。

·           memorystoreevictionpolicy:當達到maxelementsinmemory限制時,ehcache将會根據指定的政策去清理記憶體。預設政策是lru(最近最少使用)。你可以設定為fifo(先進先出)或是lfu(較少使用)。這裡比較遺憾,ehcache并沒有提供一個使用者定制政策的接口,僅僅支援三種指定政策,感覺做的不夠理想。

最後ehcache官網詳細api:http://www.ehcache.org/documentation/apis/index

并附上我的bundle,測試運作正常(圖檔上傳不了= =):

EhCache實作OSGi緩存bundle
EhCache實作OSGi緩存bundle

鑒于上傳有問題,我還是附上關鍵代碼:

cacheactivator.java

cacheservice.java

cacheserviceimpl.java

mycache.xml(同上)

很簡單,很好用吧~