【问题标题】:Infinispan cluster with Karaf instances带有 Karaf 实例的 Infinispan 集群
【发布时间】:2019-03-19 12:47:31
【问题描述】:

我们对 Infinispan 很陌生,对 Apache Karaf 也很陌生。在 Karaf 中安装 Infinispan 很容易,我们确实编写了两个 OSGi Bundle 来形成一个集群,其中包含在一个主机上运行的两个节点。我们使用 Infinispan 网站 (tutorial) 上的分布式缓存教程进行了尝试。不幸的是,集群似乎没有构建,我们无法确定原因。任何帮助或推动正确的方向将不胜感激。

在缓存中写入内容的包的代码如下所示:

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 打印有效,Listener 打印无效。

【问题讨论】:

    标签: apache-karaf infinispan


    【解决方案1】:

    我们自己找到了解决方案。

    当您尝试在 MacOS 上运行代码时才会出现问题,而在 Windows 上它正在运行。根据discussion at JBossDeveloper 的说法,MacOS 上的多播路由存在问题。即使他们在示例代码中添加了解决方法,您仍然必须在运行时添加 -Djava.net.preferIPv4Stack=true 标志,或者您必须添加这两行代码:

    Properties properties = System.getProperties();
    properties.setProperty( "java.net.preferIPv4Stack", "true" );
    

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 2016-06-08
      • 2013-04-02
      • 2016-11-11
      • 2019-03-28
      • 2018-09-27
      • 2013-06-17
      • 2017-11-09
      相关资源
      最近更新 更多