我使用infinispan并通过以下代码行初始化DefaultCacheManager:

                GlobalConfigurationBuilder gcb = new GlobalConfigurationBuilder();
                gcb.globalJmxStatistics().enabled(false).allowDuplicateDomains(true);
                gcb.transport().defaultTransport().addProperty(JGroupsTransport.CONFIGURATION_STRING,
                        configurator.getProtocolStackString());

                ConfigurationBuilder builder = new ConfigurationBuilder();
                builder.clustering().cacheMode(CacheMode.DIST_SYNC).expiration().lifespan(24l, TimeUnit.HOURS);

                builder.clustering().stateTransfer().awaitInitialTransfer(false);
                builder.clustering().hash().numOwners(2);

                cacheManager = new DefaultCacheManager(gcb.build(), builder.build());


上面的代码片段存在于部署在同一应用服务器内的N war中。

因此,当我同时部署所有战争时,发生了执行新DefaultManager()指令的并发异常

org.infinispan.jmx.JmxDomainConflictException: ISPN000034: There's already a JMX MBean instance type=CacheManager,name="DefaultCacheManager" already registered under 'org.infinispan' JMX domain.


即使我已经指定了配置属性,也会发生这种情况:

allowDuplicateDomains(true);


我如何正确处理此行为?

最佳答案

我创建了一个reproducer for this issue,据我所知它看起来不错。

只是一些陷阱和提示:


请确保您使用的是最新的稳定版本(在本例中为8.2.4.Final)。
我建议使用CDI extension而不是实现自己的引导程序和清理。
如果出于某种原因需要自己创建CacheManager,请记住在销毁bean时将其停止。
如果您使用的是Wildfly,请记住,您的CacheManager并不是容器中唯一的缓存管理器(WF使用Infinispan进行会话复制等内部操作)。

10-07 18:56
查看更多