我正在使用Infinispan 8.1和WildFly 10。
我使用以下代码行以编程方式初始化我的CacheManager:
public class SessionManager {
private static DefaultCacheManager cacheManager;
public void initializeCache(){
if (cacheManager ==null){
GlobalConfigurationBuilder gcbLocal = new GlobalConfigurationBuilder();
ConfigurationBuilder builderLocal = new ConfigurationBuilder();
builderLocal.clustering().cacheMode(CacheMode.LOCAL);
cacheManager = new DefaultCacheManager(gcbLocal.build(), builderLocal.build());
cacheManager.getCache();
这些代码行属于在我的服务器上部署的多个Web应用程序中作为依赖项导入的jar。
所以每次部署一个新的应用程序时,都会调用initialize方法,infinispan会尝试创建一个新的DefaultCacheManager,给我这个例外:
ISPN000034: There's already a JMX MBean instance type=CacheManager,name="DefaultCacheManager" already registered under 'org.infinispan' JMX domain. If you want to allow multiple instances configured with same JMX domain enable 'allowDuplicateDomains' attribute in 'globalJmxStatistics' config element
只需添加以下代码行即可解决此问题:
gcbLocal.globalJmxStatistics().allowDuplicateDomains(true);
但现在效果是Infinispan将创建一个新的域分隔的CacheManager。这意味着每个应用程序都有自己的。
我的目标是只有一个DefaultCacheManager为服务器内部署的所有Web应用程序提供服务,就像WebApplicationA在infinispan缓存中存储一些值一样,webApplicationB可以获得它。
有可能吗?如何获取全局缓存管理器?
答案 0 :(得分:2)
Ernest是对的 - MBean服务器是每个JVM而不是每个ClassLoader,因此您需要忽略重复的域。但更有趣的是 - Wildfly使用Infinispan进行会话群集,因此默认缓存管理器可能已经在运行。我强烈建议您使用自己的缓存管理器名称:
new GlobalConfigurationBuilder().globalJmxStatistics()
.cacheManagerName(CACHE_NAME).build();
Ernest还建议使用HotRod服务器集群并使用HotRod客户端连接到它(这比使用REST接口要快得多)。在您描述的情况下,这听起来很合理。
答案 1 :(得分:1)
很明显,您在Web模块(.war)中运行此代码 - 或者在war文件中捆绑的jar中运行此代码。您不能在Web模块之间共享实例,因为类加载器受到保护(这对您有利)。
您有几个选择:
不是部署war文件,而是创建一个包含多个Web模块的ear文件,然后创建一个EJB,然后创建并使用缓存管理器。然后,每个Web模块将通过本地EJB进入缓存,并在ear / lib中部署infinispan库。
运行Infinispan服务器(Infinispan的独立Wildfly安装)并更改代码以使用远程客户端:
- HotRod客户端从外部连接到它(文档:http://infinispan.org/docs/8.2.x/getting_started/getting_started.html#_using_hot_rod_to_access_an_infinispan_data_grid)。
- REST客户端(此处的文档:http://infinispan.org/docs/8.2.x/user_guide/user_guide.html#_infinispan_rest_server)
每个网络模块都可以单独执行此操作。