我使用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进行会话复制等内部操作)。