我正在使用 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。
因此,每次我部署新应用程序时,都会调用初始化方法,并且 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。这意味着每个应用程序都有自己的应用程序。
我的目标是只有 1 个 DefaultCacheManager 为服务器内部署的所有 Web 应用程序提供服务,如果 WebApplicationA 在 infinispan 缓存内存储一些值,webApplicationB 就可以获取它。
这可能吗?我如何获得全局缓存管理器?
最佳答案
Ernest 是对的 - MBean 服务器是每个 JVM 而不是每个 ClassLoader,因此您需要忽略重复的域。但更有趣的是 - Wildfly 使用 Infinispan 进行 session 集群,因此默认缓存管理器可能已经在运行。我强烈建议使用您自己的缓存管理器名称:
new GlobalConfigurationBuilder().globalJmxStatistics()
.cacheManagerName(CACHE_NAME).build();
Ernest 还建议使用 HotRod 服务器集群并使用 HotRod 客户端连接到它(这比使用 REST 接口(interface)快得多)。这在您描述的场景中听起来很合理。
关于java - 用于部署 Web 应用程序的 Infinispan 独特缓存管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142719/