河北云建站,课程网站建设的目标,wordpress 获取指定文章,网站建设几种语言对比ejb构建在本文中#xff0c;我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存。 高速缓存将在给定的时间段后重置自身#xff0c;并且可以通过调用REST端点或MBean方法“手动”清除。 这篇文章实际上是建立在以前的文章中如何建立和清除与单EJB和MBean的一… ejb构建 在本文中我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存。 高速缓存将在给定的时间段后重置自身并且可以通过调用REST端点或MBean方法“手动”清除。 这篇文章实际上是建立在以前的文章中如何建立和清除与单EJB和MBean的一个参考的数据高速缓存 ; 唯一的区别是我将使用Ehcache缓存而不是将数据存储在ConcurrentHashMapString, Object 并且该缓存能够通过Ehcache方式进行更新。 1.快取 原来这是一个只读缓存可以从外部刷新它。 我希望将缓存作为服务的一种包装为应用程序提供实际的参考数据–带代码的AOP样式 接口 参考数据的简单界面 Local
public interface ReferenceDataCache {/*** Returns all reference data required in the application */ReferenceData getReferenceData();/*** evict/flush all data from cache */void evictAll();
} 缓存功能定义了两种简单的方法 getReferenceData() –缓存所有不同来源在后台收集的参考数据 evictAll() –调用方法以完全清除缓存 实作 使用Ehcache的简单参考数据缓存实现 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);}OverrideLock(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 –可能是此类中最重要的代码行。 此注释指定在应用程序中将仅存在一个这种类型的bean的单例。 该bean可以由多个线程同时调用。 现在让我们将代码分解为不同的部分 缓存初始化 PostConstruct注释用于在依赖项注入完成后需要执行的方法上以执行任何初始化–在我们的情况下是创建和初始化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的所有用法都始于创建CacheManager 它是Ehcache的容器可维护其生命周期的各个方面。 我使用CacheManager.create()方法这是一种使用默认配置创建单例CacheManager的工厂方法如果存在则将其返回 cacheManager CacheManager.create(); 我通过提供缓存名称“ referenceDataCache”和内存中最大元素数 maxEntriesLocalHeap 来构建CacheConfiguration对象然后将它们逐出0 无限制最后我进行设置自元素创建之日起元素的默认生存时间 CacheConfiguration cacheConfiguration new CacheConfiguration(referenceDataCache, 1000); cacheConfiguration.setTimeToLiveSeconds(CACHE_MINUTES_TO_LIVE * 60); 现在借助于CacheConfiguration对象我以编程方式创建了我的参考数据缓存并将其添加到CacheManager中。 请注意只有将缓存添加到CacheManager后它们才可用 refDataEHCache new Cache(cacheConfiguration ); cacheManager.addCache(refDataEHCache); 注意您也可以以声明的方式创建缓存创建CacheManager时它将创建在配置中找到的缓存。 您可以通过指定配置文件的路径类路径中的配置InputStream中的配置或类路径中的默认ehcache.xml文件来创建CacheManager。 查看Ehcache代码示例以获取更多信息。 从缓存中获取数据 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;}
} 首先我尝试根据元素的键从缓存中获取该元素如果元素存在于缓存中 null 则将从服务类接收该元素并将其放置在缓存中以供将来请求。 注意 Lock(LockType.READ)指定具有容器管理的并发性的单例bean的并发锁定类型。 设置为LockType.READ 它将强制执行该方法以允许对其进行完全并发访问假定未持有任何写锁。 这正是我想要的因为我只需要执行读取操作。 另一个更保守的选项Lock(LockType.WRITE)顺便说一下是DEFAULT它强制对bean实例的独占访问。 这应该在高度并发的环境中使方法变慢。 清除缓存 清除缓存 Override public void evictAll() { cacheManager.clearAll(); } CacheManager的clearAll()方法清除CacheManager中所有缓存的内容但不删除任何缓存。 我在这里只是为了简单起见使用它因为我只有一个缓存因此需要刷新。 注意如果您有多个高速缓存即多个高速缓存名称并且只想清除一个则需要使用CacheManager.clearAllStartingWith(String prefix) 该名称以CacheManager开头的名称清除CacheManager中所有高速缓存的内容。前缀但不删除它们。 2.如何触发缓存缓存 这篇文章的第二部分将讨论清除缓存的可能性。 由于缓存实现是一个企业Java Bean因此我们可以从MBean或从Web服务中调用它。 MBean 如果您不熟悉Java管理扩展JMX 这是一种Java技术它提供用于管理和监视应用程序系统对象设备例如打印机和面向服务的网络的工具。 这些资源由称为MBeans用于Managed Bean的对象表示 我强烈建议您从本教程的路径Java管理扩展JMX开始。 接口 公开的方法仅允许通过JMX重置缓存 MXBean public interface CacheResetMXBean { void resetReferenceDataCache(); } “ MXBean是一种MBean仅引用一组预定义的数据类型。 这样您可以确保您的MBean可被任何客户端包括远程客户端使用而无需客户端有权访问代表MBean类型的特定于模型的类。 MXBean提供了一种将相关值捆绑在一起的便捷方法而无需将客户端特别配置为处理捆绑。” [5] 实作 CacheReset MxBean实现 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:typeCacheReset);platformMBeanServer ManagementFactory.getPlatformMBeanServer();//unregister the mbean before registerting againSetObjectName 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();}} 注意 如前所述该实现仅调用上一节中介绍的注入的单例bean的evictAll()方法 该bean也被定义为Singleton Startup批注导致在应用程序启动时由容器实例化Bean – 渴望初始化 我再次使用PostConstruct功能。 在这里 此 bean已在JMX中注册如果有的话请检查是否使用ObjectName将其删除。 休息服务电话 我还内置了通过调用REST资源清除缓存的可能性。 在rest-context/ reference-data / flush-cache上执行HTTP POST时会发生这种情况 通过REST资源触发缓存刷新 Path(/reference-data)
public class ReferenceDataResource {EJBReferenceDataCache referenceDataCache;POSTPath(flush-cache)public Response flushReferenceDataCache() {referenceDataCache.evictAll();return Response.status(Status.OK).entity(Cache successfully flushed).build();} GETProduces({ 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(...)方法中存在版本查询参数。 这表示参考数据上的哈希如果尚未修改则客户端将收到304未修改HTTP状态 。 这是节省带宽的好方法尤其是在您拥有移动客户端的情况下。 有关REST服务设计和实现的详细讨论请参阅我的教程“使用Jersey和Spring的Java REST API设计和实现”。 注意在集群环境中当参考数据更改时需要在部署了应用程序的每个JVM上调用resetCache…。 好就是这样。 在本文中我们学习了如何借助Ehcache在Java EE中构建简单的参考数据缓存。 当然您可以轻松扩展缓存功能以提供对缓存对象的更精细的访问/清除。 在这种情况下请不要忘记使用LockType.WRITE作为清除方法…… 翻译自: https://www.javacodegeeks.com/2014/11/how-to-build-and-clear-a-reference-data-cache-with-singleton-ejbs-ehcache-and-mbeans.htmlejb构建