java - infinispan:集群实例不共享缓存

标签 java caching cluster-computing infinispan

我花了 2 天多的时间,除了尝试让 Infinispan 在集群环境中工作之外什么也没做,但它不起作用。我不想运行单独的 infinispan 服务器,我只想将其嵌入在集群 Glassfish 上运行的应用程序中。那不可能吗?我有一个示例 JSF 应用程序,您可以在其中将值加载到应该位于缓存中的 map 中。我拉起一个集群实例,添加值,它们就会显示出来。但是当我转到另一个集群实例时,它显示 map 为空。

我知道我做错了什么,但我不知道是什么。一直在互联网上搜索,但没有关于如何让它工作的全面教程。

配置(从据称显示集群的教程复制 http://www.mastertheboss.com/infinispan/infinispan-tutorial-part-2/page-2 ):

<infinispan>

    <global>
      <transport clusterName="demoCluster"/>
      <globalJmxStatistics enabled="true"/>
   </global>

   <default>
      <jmxStatistics enabled="true"/>
      <clustering mode="distribution">
         <hash numOwners="2" rehashRpcTimeout="120000"/>
         <sync/>
      </clustering>
   </default>

</infinispan>

上下文监听器:

package hazelcache.test;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;

@WebListener()
public class Listener implements ServletContextListener
{
    EmbeddedCacheManager manager;

    @Override
    public void contextInitialized(ServletContextEvent sce)
    {
        try
        {
            manager = new DefaultCacheManager("config.xml");
            manager.start();
            sce.getServletContext().setAttribute("cacheManager", manager);
        }
        catch (IOException ex)
        {
            Logger.getLogger(Listener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce)
    {
        manager.stop();
    }
}

bean :

package hazelcache.test;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;

@ManagedBean(name="clusterTest")
public class ClusteredCacheBean extends CacheTestBean
{
    EmbeddedCacheManager manager;

    public ClusteredCacheBean() throws IOException
    {
        System.out.println("Before setStuffz()");

        manager = (EmbeddedCacheManager) ((ServletContext)FacesContext.getCurrentInstance().
                getExternalContext().getContext()).getAttribute("cacheManager");

        setStuffz(manager.getCache("stuffz"));
        System.out.println("After setStuffz()");

    }// end ClusteredCacheBean()

    private static EmbeddedCacheManager createCacheManagerProgramatically() {
        return new DefaultCacheManager(GlobalConfigurationBuilder.defaultClusteredBuilder().build());
     }

    @Override
    public String addToCache()
    {
        String forwardTo = null;

        manager.getCache("stuffz").put(getId(), getName());

        return forwardTo;

    }// end addToCache()

    @Override
    public List getStuffzList()
    {
        System.out.println("Stuffz: " + getStuffz().size());
        return new LinkedList(manager.getCache("stuffz").entrySet());
    }
}// end class ClusteredCacheBean

我现在真的不知道该怎么办...

最佳答案

另一个论坛上的一个很棒的人帮助我解决了这个问题:

1) 设置此 jvm 选项:-Djava.net.preferIPv4Stack=true

asadmin> create-jvm-options --target ClusterName -Djava.net.preferIPv4Stack=true

2) 在监听器中调用 getCache 一次,以便在事物启动时创建缓存:

setStuffz(manager.getCache("stuffz"));

3)将命名空间放在配置文件中:

<infinispan
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:infinispan:config:5.1 http://docs.jboss.org/infinispan/schemas/infinispan-config-5.1.xsd"
      xmlns="urn:infinispan:config:5.1">

谢谢 jBoss 论坛 (https://community.jboss.org/community/infinispan) 的 Tristan!

关于java - infinispan:集群实例不共享缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13325275/

相关文章:

c++ - MPI 代码不适用于 2 个节点,但适用于 1 个

java - Hibernate-Search - 使用 lucene 查询解析器语法进行不区分大小写的通配符搜索(不使用 QueryBuilder!)

java - Java 中已弃用的 JDBC 日期(java.sql 包)

Linux文件异常:Device or resource busy

c++ - 无法在 Intel Xeon Phi 上执行二进制错误

caching - Kepler 中的 L2 缓存

java - 处理 NullPointerException 在 ArrayList 中找不到记录

java - 目标兼容性和与该JDK运行Gradle有区别吗?

iis - 如何防止 IIS 发送带有 ASHX 文件的缓存 header

javascript - 从 iframe 访问父窗口缓存