1

クラスター化された環境で Infinispan を動作させようとして 2 日間以上何もしませんでしたが、動作しません。個別の infinispan サーバーを実行したくありません。クラスター化された Glassfish で実行されるアプリケーションに組み込みたいだけです。それは不可能ですか?キャッシュにあるはずのマップに値をロードするだけのサンプル JSF アプリを入手しました。クラスター化されたインスタンスを 1 つ取得し、値を追加すると、値が表示されます。しかし、他のクラスター化されたインスタンスに移動すると、マップが空として表示されます。

私は何か間違ったことをしていることを知っています、私はただ何を知りません。インターネットを検索していますが、それを機能させる方法に関する包括的なチュートリアルはありません。

config (クラスタリングを示していると思われるチュートリアルからコピー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

この時点でどうすればいいのか本当にわかりません...

4

1 に答える 1

1

別のフォーラムの素晴らしい人が私にそれを理解するのを助けてくれました:

1) この jvm オプションを設定します: -Djava.net.preferIPv4Stack=true

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

2) リスナーで getCache を 1 回呼び出して、物事の起動時にキャッシュを作成します。

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 に感謝します。

于 2012-11-21T17:33:10.507 に答える