日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在本文中,我將介紹如何使用單例EJB和Ehcache在Java EE中構(gòu)建簡單的參考數(shù)據(jù)緩存。 高速緩存將在給定的時(shí)間段后重置自身,并且可以通過調(diào)用REST端點(diǎn)或MBean方法“手動(dòng)”清除。 這篇文章實(shí)際上是在以前的文章的基礎(chǔ)上建立的 。 唯一的區(qū)別是,我將使用Ehcache緩存,而不是將數(shù)據(jù)存儲在ConcurrentHashMap<String, Object> ,并且該緩存能夠通過Ehcache方式進(jìn)行更新。

1.快取

這應(yīng)該是只讀緩存,可以從外部刷新它。 我希望將緩存作為服務(wù)上的一種包裝,為應(yīng)用程序提供實(shí)際的參考數(shù)據(jù)-帶代碼的AOP樣式!

接口

參考數(shù)據(jù)的簡單界面

@Local public interface ReferenceDataCache {/*** Returns all reference data required in the application */ReferenceData getReferenceData();/*** evict/flush all data from cache */void evictAll(); }

緩存功能定義了兩種簡單的方法:

  • getReferenceData() –緩存所有不同來源在后臺收集的參考數(shù)據(jù)
  • evictAll() –調(diào)用方法以完全清除緩存

實(shí)作

使用Ehcache的簡單參考數(shù)據(jù)緩存實(shí)現(xiàn)

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) @Singleton public class ReferenceDataCacheBean implements ReferenceDataCache {private static final String ALL_REFERENCE_DATA_KEY = "ALL_REFERENCE_DATA";private static final int CACHE_MINUTES_TO_LIVE = 100;private CacheManager cacheManager;private Cache refDataEHCache = null; @EJBReferenceDataLogic referenceDataService; @PostConstructpublic void initialize(){ cacheManager = CacheManager.getInstance();CacheConfiguration cacheConfiguration = new CacheConfiguration("referenceDataCache", 1000);cacheConfiguration.setTimeToLiveSeconds(CACHE_MINUTES_TO_LIVE * 60);refDataEHCache = new Cache(cacheConfiguration );cacheManager.addCache(refDataEHCache);}@Override@Lock(LockType.READ)public ReferenceData getReferenceData() {Element element = refDataEHCache.get(ALL_REFERENCE_DATA_KEY);if(element != null){ return (ReferenceData) element.getObjectValue();} else {ReferenceData referenceData = referenceDataLogic.getReferenceData();refDataEHCache.putIfAbsent(new Element(ALL_REFERENCE_DATA_KEY, referenceData));return referenceData;} }@Overridepublic void evictAll() {cacheManager.clearAll();} ........... }

注意:

  • @Singleton –可能是此類中最重要的代碼行。 此注釋指定在應(yīng)用程序中將僅存在一個(gè)這種類型的bean的單例。 該bean可以由多個(gè)線程同時(shí)調(diào)用。

現(xiàn)在讓我們將代碼分解為不同的部分:

緩存初始化

@PostConstruct批注用于依賴注入完成后需要執(zhí)行的方法,以執(zhí)行任何初始化–在我們的情況下,是創(chuàng)建和初始化(eh)緩存。

緩存初始化

@PostConstructpublic void initialize(){ cacheManager = CacheManager.create();CacheConfiguration cacheConfiguration = new CacheConfiguration("referenceDataCache", 1000);cacheConfiguration.setTimeToLiveSeconds(CACHE_MINUTES_TO_LIVE * 60);refDataEHCache = new Cache(cacheConfiguration );cacheManager.addCache(refDataEHCache);}

注意:此注釋只能注釋一種方法。

Ehcache的所有用法都始于創(chuàng)建CacheManager ,它是Ehcache的容器,可維護(hù)其生命周期的各個(gè)方面。 我使用CacheManager.create()方法,這是一種使用默認(rèn)配置創(chuàng)建單例CacheManager的工廠方法,如果存在,則將其返回:

cacheManager = CacheManager.create();

我通過提供緩存名稱(“ referenceDataCache”)和內(nèi)存中最大元素?cái)?shù)( maxEntriesLocalHeap )來構(gòu)建CacheConfiguration對象,然后將它們逐出(0 ==無限制),最后我進(jìn)行設(shè)置自元素創(chuàng)建之日起,元素的默認(rèn)生存時(shí)間:

CacheConfiguration cacheConfiguration = new CacheConfiguration("referenceDataCache", 1000); cacheConfiguration.setTimeToLiveSeconds(CACHE_MINUTES_TO_LIVE * 60);

現(xiàn)在,借助CacheConfiguration對象,我以編程方式創(chuàng)建了我的參考數(shù)據(jù)緩存,并將其添加到CacheManager中。 請注意,只有將緩存添加到CacheManager后,它們才可用:

refDataEHCache = new Cache(cacheConfiguration ); cacheManager.addCache(refDataEHCache);

注意:您也可以以聲明的方式創(chuàng)建緩存:創(chuàng)建CacheManager時(shí),它將創(chuàng)建在配置中找到的緩存。 您可以通過指定配置文件的路徑,類路徑中的配置,InputStream中的配置或類路徑中的默認(rèn)ehcache.xml文件來創(chuàng)建CacheManager。 查看Ehcache代碼示例以獲取更多信息。

從緩存中獲取數(shù)據(jù)

@Override @Lock(LockType.READ) public ReferenceData getReferenceData() {Element element = refDataEHCache.get(ALL_REFERENCE_DATA_KEY);if(element != null){ return (ReferenceData) element.getObjectValue();} else {ReferenceData referenceData = referenceDataLogic.getReferenceData();refDataEHCache.put(new Element(ALL_REFERENCE_DATA_KEY, referenceData));return referenceData;} }

首先,我嘗試根據(jù)其鍵從緩存中獲取元素,如果元素存在于緩存中( ==null ),則將從服務(wù)類接收該元素并將其放置在緩存中以供將來請求。

注意:

@Lock(LockType.READ)指定具有容器管理的并發(fā)性的單例bean的并發(fā)鎖定類型。 當(dāng)設(shè)置為LockType.READ ,它將強(qiáng)制執(zhí)行該方法以允許對其進(jìn)行完全并發(fā)訪問(假定未持有任何寫鎖)。 這正是我想要的,因?yàn)槲抑恍枰獔?zhí)行讀取操作。 另一個(gè)更保守的選項(xiàng)@Lock(LockType.WRITE)順便說一下是DEFAULT,它強(qiáng)制對bean實(shí)例的獨(dú)占訪問。 這應(yīng)該在高度并發(fā)的環(huán)境中使方法變慢。

清除緩存

清除緩存

@Override public void evictAll() { cacheManager.clearAll(); }

CacheManager的clearAll()方法清除CacheManager中所有緩存的內(nèi)容,但不刪除任何緩存。 我在這里只是為了簡單起見使用它,因?yàn)槲抑挥幸粋€(gè)緩存,因此需要刷新。

注意:如果您有多個(gè)高速緩存,即多個(gè)高速緩存名稱,并且只想清除一個(gè),則需要使用CacheManager.clearAllStartingWith(String prefix) ,該名稱以CacheManager開頭的名稱清除CacheManager中所有高速緩存的內(nèi)容。前綴,但不刪除它們。

2.如何觸發(fā)緩存緩存

這篇文章的第二部分將討論清除緩存的可能性。 由于緩存實(shí)現(xiàn)是企業(yè)Java Bean,因此我們可以從MBean或從Web服務(wù)中調(diào)用它。

MBean

如果您不熟悉Java管理擴(kuò)展(JMX), 這是一種Java技術(shù),它提供用于管理和監(jiān)視應(yīng)用程序,系統(tǒng)對象,設(shè)備(例如打印機(jī))和面向服務(wù)的網(wǎng)絡(luò)的工具。 這些資源由稱為MBeans(用于Managed Bean)的對象表示 ,我強(qiáng)烈建議您從本教程的起點(diǎn)開始:Java管理擴(kuò)展(JMX)

接口

公開的方法僅允許通過JMX重置緩存:

@MXBean public interface CacheResetMXBean { void resetReferenceDataCache(); }

“ MXBean是一種MBean,僅引用一組預(yù)定義的數(shù)據(jù)類型。 這樣,您可以確保您的MBean可被任何客戶端(包括遠(yuǎn)程客戶端)使用,而無需客戶端有權(quán)訪問代表MBean類型的特定于模型的類。 MXBean提供了一種方便的方式將相關(guān)值捆綁在一起,而無需將客戶端進(jìn)行特殊配置以處理捆綁。” [5]

實(shí)作

CacheReset MxBean實(shí)現(xiàn)

@Singleton @Startup public class CacheReset implements CacheResetMXBean {private MBeanServer platformMBeanServer;private ObjectName objectName = null;@EJBReferenceDataCache referenceDataCache;@PostConstructpublic void registerInJMX() {try {objectName = new ObjectName("org.codingpedia.simplecacheexample:type=CacheReset");platformMBeanServer = ManagementFactory.getPlatformMBeanServer();//unregister the mbean before registerting againSet<ObjectName> existing = platformMBeanServer.queryNames(objectName, null);if(existing.size() > 0){platformMBeanServer.unregisterMBean(objectName);}platformMBeanServer.registerMBean(this, objectName);} catch (Exception e) {throw new IllegalStateException("Problem during registration of Monitoring into JMX:" + e);}} @Overridepublic void resetReferenceDataCache() {referenceDataCache.evictAll();}}

注意:

  • 如前所述,該實(shí)現(xiàn)僅調(diào)用上一節(jié)中介紹的注入的單例bean的evictAll()方法
  • 該bean也被定義為@Singleton
  • @Startup批注導(dǎo)致在應(yīng)用程序啟動(dòng)時(shí)由容器實(shí)例化@Startup 渴望初始化
  • 我再次使用@PostConstruct功能。 在這里, bean已在JMX中注冊,如果是,則檢查是否使用ObjectName將其刪除。

休息服務(wù)電話

我還內(nèi)置了通過調(diào)用REST資源清除緩存的可能性。 在(rest-context)/ reference-data / flush-cache上執(zhí)行HTTP POST時(shí)會(huì)發(fā)生這種情況:

通過REST資源觸發(fā)緩存刷新

@Path("/reference-data") public class ReferenceDataResource {@EJBReferenceDataCache referenceDataCache;@POST@Path("flush-cache")public Response flushReferenceDataCache() {referenceDataCache.evictAll();return Response.status(Status.OK).entity("Cache successfully flushed").build();} @GET@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })public Response getReferenceData(@QueryParam("version") String version) {ReferenceData referenceData = referenceDataCache.getReferenceData(); if(version!=null && version.equals(referenceData.getVersion())){return Response.status(Status.NOT_MODIFIED).entity("Reference data was not modified").build(); } else {return Response.status(Status.OK).entity(referenceData).build(); }} }

注意@GET getReferenceData(...)方法中存在版本查詢參數(shù)。 這表示參考數(shù)據(jù)上的哈希,如果尚未修改,則客戶端將收到304未修改HTTP狀態(tài) 。 這是節(jié)省一些帶寬的好方法,尤其是在您擁有移動(dòng)客戶端的情況下。 有關(guān)REST服務(wù)設(shè)計(jì)和實(shí)現(xiàn)的詳細(xì)討論,請參閱我的教程“使用Jersey和Spring的Java REST API設(shè)計(jì)和實(shí)現(xiàn)”。

注意:在集群環(huán)境中,當(dāng)參考數(shù)據(jù)更改時(shí),需要在部署了應(yīng)用程序的每個(gè)JVM上調(diào)用resetCache(…)。

好吧,就是這樣。 在本文中,我們學(xué)習(xí)了如何借助Ehcache在Java EE中構(gòu)建簡單的參考數(shù)據(jù)緩存。 當(dāng)然,您可以輕松擴(kuò)展緩存功能,以提供對緩存對象的更精細(xì)的訪問/清除。 在這種情況下,請不要忘記使用LockType.WRITE作為清除方法……

翻譯自: https://www.javacodegeeks.com/2014/11/how-to-build-and-clear-a-reference-data-cache-with-singleton-ejbs-ehcache-and-mbeans.html

總結(jié)

以上是生活随笔為你收集整理的如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。