Infinispan кластер с экземплярами Карафа - PullRequest
0 голосов
/ 15 октября 2018

мы очень плохо знакомы с Infinispan, а также довольно плохо знакомы с Apache Karaf.Установка Infinispan в Karaf была простой, мы написали два пакета OSGi, чтобы сформировать кластер с двумя узлами, работающими на одном хосте.Мы попробовали это с учебником для распределенного кэша с веб-сайта Infinispan ( учебник ).К сожалению, кластер, похоже, не создан, и мы не можем определить, почему.Любая помощь или толчок в правильном направлении будет очень признателен.

Код пакета, который записывает что-то в кэш, выглядит так:

import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.context.Flag;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CacheProducer implements BundleActivator{

    private static Logger LOG = LoggerFactory.getLogger(CacheProducer.class );
    private static DefaultCacheManager cacheManager;

    @Override
     public void start( BundleContext context ) throws Exception{
        LOG.info( "Start Producer" );
        GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
        global.transport().clusterName("ClusterTest");

        // Make the default cache a distributed synchronous one
        ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.clustering().cacheMode(CacheMode.DIST_SYNC);

        // Initialize the cache manager
        cacheManager = new DefaultCacheManager(global.build(), builder.build());

        // Obtain the default cache
        Cache<String, String> cache = cacheManager.getCache();

        cache.put( "message", "Hello World!" );

        LOG.info( "Producer: whole cluster content!" );
        cache.entrySet().forEach(entry -> LOG.info(entry.getKey()+ ": " + entry.getValue()));
        LOG.info( "Producer: current cache content!" );
        cache.getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP)
                    .entrySet().forEach(entry -> LOG.info(entry.getKey()+ ": " + entry.getValue()));
}

    @Override
    public void stop( BundleContext context ) throws Exception{
        cacheManager.stop();
    }

}

И тот, который пытается напечататьто, что находится в кеше, выглядит так:

package metdoc81.listener;

import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Activator implements BundleActivator{

    private static Logger LOG = LoggerFactory.getLogger(Activator.class);
    private static DefaultCacheManager cacheManager;

    public void start( BundleContext bundleContext ) throws Exception{
        LOG.info("start cluster listener");
        GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
        global.transport().clusterName("ClusterTest");

        // Make the default cache a distributed synchronous one
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.clustering().cacheMode(CacheMode.DIST_SYNC);

        // Initialize the cache manager
        cacheManager = new DefaultCacheManager(global.build(), builder.build());

        // Obtain the default cache
        Cache<String, String> cache = cacheManager.getCache();

        LOG.info("After configuration");
        cache.entrySet().forEach(entry -> LOG.info(entry.getKey()+ ": " + entry.getValue()));
        LOG.info("After logging");
    }

    public void stop( BundleContext bundleContext ) throws Exception{

    }

}

Печать из CacheProducer работает, печать из слушателя - нет.

1 Ответ

0 голосов
/ 17 октября 2018

Мы нашли решение сами.

Проблема возникает только при попытке запустить код на MacOS, в Windows он работает.Согласно обсуждению на JBossDeveloper возникла проблема с многоадресной маршрутизацией на MacOS.Несмотря на то, что они добавили обходной путь в пример кода, вы все равно должны добавить флаг -Djava.net.preferIPv4Stack=true при его запуске, или вы должны добавить эти две строки кода:

Properties properties = System.getProperties();
properties.setProperty( "java.net.preferIPv4Stack", "true" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...