用于部署的Web应用程序的Infinispan Unique Cache Manager

时间:2016-07-01 10:10:00

标签: java caching wildfly infinispan

我正在使用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可以获得它。

有可能吗?如何获取全局缓存管理器?

2 个答案:

答案 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模块之间共享实例,因为类加载器受到保护(这对您有利)。

您有几个选择:

  1. 不是部署war文件,而是创建一个包含多个Web模块的ear文件,然后创建一个EJB,然后创建并使用缓存管理器。然后,每个Web模块将通过本地EJB进入缓存,并在ear / lib中部署infinispan库。

  2. 运行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

    每个网络模块都可以单独执行此操作。