ejb构建_如何使用单例EJB和MBean构建和清除参考数据缓存
ejb构建
在我的一个项目中,我需要使用EclipseLink作为ORM框架从Java EE 6 WebLogic环境中的多个源中加载参考数据。 由于我在Java EE世界中找不到与Spring YET的@Cacheable相当的注释,因此我不得不编写自己的缓存解决方案。 尽管参考数据几乎不会随时间变化,但是一项额外的要求是能够从外部清除缓存。 所以就这样...
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()
–调用方法以完全清除缓存
实作
使用@Singleton的简单参考数据缓存实现
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
public class ReferenceDataCacheBean implements ReferenceDataCache {private static final String ALL_REFERENCE_DATA_KEY = "ALL_REFERENCE_DATA";private ConcurrentHashMap<String, Object> refDataCache = null;@EJBReferenceDataService referenceDataService;@PostConstructpublic void initialize(){this.refDataCache = new ConcurrentHashMap<>(); }@Override@Lock(LockType.READ)public ReferenceData getReferenceData() {if(refDataCache.containsKey(ALL_REFERENCE_DATA_KEY)){ return refDataCache.get(ALL_REFERENCE_DATA_KEY);} else {ReferenceData referenceData = referenceDataService.getReferenceData();refDataCache.put(ALL_REFERENCE_DATA_KEY, referenceData);return referenceData;} }@Overridepublic void evictAll() {refDataCache.clear(); } ..........
}
注意:
@Singleton
–可能是此类中最重要的代码行。 此注释指定在应用程序中将仅存在一个这种类型的bean的单例。 该bean可以由多个线程同时调用。 它还带有@PostConstruct
批注。 此注释用于需要依赖注入完成后才能执行任何初始化的方法,在本例中是初始化“缓存”(哈希映射)@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
声明单例会话bean的并发管理类型。 默认情况下,它设置为Container
。 我在这里使用它只是为了强调它的存在。 另一个选项ConcurrencyManagementType.BEAN
指定Bean开发人员负责管理对Bean实例的并发访问。- 实际的“缓存”是
ConcurrentHashMap
,它具有基于String
的键并存储Object
。 由于bean的单例性质,它被保留在内存中 - 注入的
ReferenceDataService
是@Stateless
@EJB
,它在后台收集来自不同来源的参考数据 - getReferenceData()方法的实现非常简单–它检查
ConcurrentHashMap
是否具有将String键指定为常量“ALL_REFERENCE_DATA
”的条目。 如果是这样,它将从内存中检索,否则将由服务Bean加载。 @Lock(LockType.READ)
指定具有容器管理的并发性的单例bean的并发锁定类型。 设置为LockType.READ
,它将强制执行该方法以允许对其进行完全并发访问(假定未持有任何写锁)。 这正是我想要的,因为我只需要执行读取操作。 另一个更保守的选项@Lock(LockType.WRITE)
顺便说一下是DEFAULT,它强制对bean实例的独占访问。 这应该在高度并发的环境中使方法变慢。evictAll()
方法,只是从哈希图中删除所有元素。
2.刷新缓存
这篇文章的第二部分将讨论清除缓存的可能性。 由于缓存实现是一个企业Java Bean,因此我们可以从MBean或从Web服务中调用它。
MBean
如果您不熟悉Java管理扩展(JMX), 这是一种Java技术,它提供用于管理和监视应用程序,系统对象,设备(例如打印机)和面向服务的网络的工具。 这些资源由称为MBeans(用于Managed Bean)的对象表示 ,我强烈建议您从本教程的路径:Java管理扩展(JMX)开始。
2.1.1。 接口
公开的方法仅允许通过JMX重置缓存:
CacheRest MBean
@MXBean
public interface CacheResetMXBean {void resetReferenceDataCache();
}
“ MXBean是一种MBean,仅引用一组预定义的数据类型。 这样,您可以确保您的MBean可被任何客户端(包括远程客户端)使用,而无需客户端有权访问代表MBean类型的特定于模型的类。 MXBean提供了一种将相关值捆绑在一起的便捷方法,而无需将客户端特别配置为处理捆绑。” [4]
2.1.2。 实作
MBean的CacheReset实现
@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();}}
注意:
- 如前所述,该实现仅调用上一节中介绍的注入的单例bean的
evictAll()
方法 - 该bean也被定义为
@Singleton
@Startup
批注导致在应用程序启动时由容器实例化Bean – 渴望初始化- 我再次使用
@PostConstruct
功能。 在这里, 此 bean已在JMX中注册,如果有的话,请检查是否使用ObjectName
将其删除。
休息服务电话
我还内置了通过调用REST资源清除缓存的可能性。 在(rest-context)/ reference-data / flush-cache上执行HTTP POST时会发生这种情况:
在参考数据缓存上进行剩余调用
@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(...)
方法中存在版本查询参数。 这表示参考数据上的哈希,如果尚未修改,则客户端将收到304未修改HTTP状态 。 这是节省带宽的好方法,尤其是在您拥有移动客户端的情况下。 有关REST服务设计和实现的详细讨论,请参阅我的教程“使用Jersey和Spring的Java REST API设计和实现”。
注意:
在集群环境中,当参考数据更改时,需要在部署了应用程序的每个JVM上调用resetCache(…)。
好,就是这样。 在本文中,我们学习了如何使用Java EE批注构建简单的缓存。 当然,您可以轻松扩展缓存功能,以提供对缓存对象的更精细的访问/清除。 在这种情况下,请不要忘记使用LockType.WRITE
作为清除方法……
翻译自: https://www.javacodegeeks.com/2014/09/how-to-build-and-clear-a-reference-data-cache-with-singleton-ejbs-and-mbeans.html
ejb构建
ejb构建_如何使用单例EJB和MBean构建和清除参考数据缓存相关推荐
- ejb构建_如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存
ejb构建 在本文中,我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存. 高速缓存将在给定的时间段后重置自身,并且可以通过调用REST端点或MBean方法" ...
- 如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存
在本文中,我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存. 高速缓存将在给定的时间段后重置自身,并且可以通过调用REST端点或MBean方法"手动&quo ...
- 如何使用单例EJB和MBean构建和清除参考数据缓存
在我的一个项目中,我需要使用EclipseLink作为ORM框架从Java EE 6 WebLogic环境中的多个源中加载参考数据. 由于我在Java EE世界中找不到与Spring YET的@Cac ...
- 五种常用设计模式的python实现:单例、工厂、构建者、代理、观察模式
这里写自定义目录标题 前言 1.单例模式 第 1 种,重写 __new__ 方法 第 2 种,闭包定义装饰器 2.工厂模式 第 1 种,简单工厂 第 2 种,工厂方法 第 3 种,抽象工厂 3.构建者 ...
- python线程安全的单例_[python笔记] 单例的几种实现方式(线程安全)
单例实现方式: 1.单例装饰器; 2.使用类: 3.使用元类 1.单例装饰器(非线程安全) 通过装饰器使一个类变成单例类,但是并非线程安全的,多线程状态下,每个线程创建不同的实例,因为没有加线程锁,所 ...
- java 单例 并发_完美的单例实现(The Perfect Singleton)
原文链接 作者:Marek Piechut 译者:陈振阳 我经常遇到一些这样的Java程序员,他们不确定应该如何恰当的实现单例模式. 我不考虑在线程的环境中合适的实现.但是使用你能在网络上找到 ...
- 单例模式代码_设计模式之单例:程序员必知必会,举例子+代码示例,通俗易懂...
推荐学习 给力!啃烂这套"核心知识"+"高级面试",成功定级腾讯JavaT4 举个通俗的例子:我们电脑桌面上的一些软件快捷方式,我们可以创建多个这样的快捷方式, ...
- 基于openstack的私有云构建_阿里云杨敬宇:四层技术构建基于城市场景的边缘计算...
12月11日,阿里云边缘计算技术负责人杨敬宇在2019亚太内容分发大会上表示:在未来,边缘计算主要是以地市.区县为单位开展,面向城市服务的交通.医疗.健康.教育.新零售等场景提供算力基础.阿里云认为边 ...
- serverless 构建_使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用程序-Episode…...
serverless 构建 by Dmitri Zimine 由Dmitri Zimine 使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用 ...
最新文章
- git revert 的问题
- 硬编码学习笔记(一)—— 经典定长指令
- Mac安装code blocks以及解无法打开的问题
- Linux下查看软件安装路径(whereis)
- mfc检测一个目录是否产生新文件_细数Java8中那些让人纵享丝滑的文件操作
- java访问mysql_Java访问数据库
- IA64与x64的区别
- 论述计算机辅助设计技术主要包括的内容,计算机辅助设计复习思考题
- linux svn 修改回退,玩转SVN-版本回退
- python生成加密exe_python加密保护-加密exe文件
- 【房价预测】BP神经网络回归的现实应用-上海市二手房价格影响因素分析——思路剖析和结果分享
- Java首选项Preferences
- 秒杀项目总结及面试常见问题
- MCDownloader(iOS下载器)说明书
- RAID和LVM磁盘阵列技术
- 网络问答口碑营销的作用和价值分析
- 《第1阶段》——正交试验法
- React新生命周期--getDerivedStateFromProps、getSnapshotBeforeUpdate
- java零钱换整程序_零钱兑换 Java
- IE8兼容那些事(包括react)