2012-11-10 66 views
1

我花了2天做什麼,但試圖讓Infinispan的在集羣環境中工作,它不工作。我不想運行單獨的infinispan服務器,我只想將其嵌入到在羣集Glassfish上運行的應用程序中。這不可能嗎?我有一個示例JSF應用程序,您可以將值加載到應該位於緩存中的映射中。我拉起一個集羣實例,添加值,它們顯示出來。但是當我去到另一個集羣實例時,它將地圖顯示爲空。的Infinispan:clustred情況下不共享緩存

我知道我做錯了什麼,我只是不知道是什麼。一直在尋找互聯網,並沒有關於如何使其工作的綜合教程。

配置(從教程coppied,理應顯示集羣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(); 
    } 
} 

豆:

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 

我真的不知道是什麼在這一點上做...

+0

您沒有包含setStuffz和getStuffz的源代碼。我也看不到任何使用createCacheManagerProgramatically或addToCache。 –

+0

createCacheManagerProgramatically未使用。 addToCache從jsf調用。 public Map getStuffz() { return stuffz; } public void setStuffz(Map stuffz) { this.stuffz = stuffz; } – Creature

回答

1

一個人的精彩另一個論壇上幫我弄明白:

1)設置此JVM選項:-Djava.net.preferIPv4Stack =真

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)!

相關問題