访问同一JVM上的单个hazelcast实例

时间:2015-02-03 23:19:48

标签: java jvm hazelcast

我有一个Java Web应用程序(在Tomcat上运行),并希望在应用程序中的两个不同上下文之间共享数据。我想使用hazelcast,因为我已经将它用于群集目的。

有没有办法访问在同一个JVM(和同一个端口)上运行的单个hazelcast实例?

我尝试使用实例名称访问实例,但这似乎不起作用。例如:

public class HazelcastTest1 {

    static public void main(String[] args) {
        Config config = new Config();
        config.getNetworkConfig().setPort(5701);
        config.getNetworkConfig().setPortAutoIncrement(false);
        config.setInstanceName("hztest");
        HazelcastInstance hz = Hazelcast.getOrCreateHazelcastInstance(config);
        Map<String, String> mp = hz.getMap("vcutest");
        mp.put("test1", "test1");
        System.out.printf("put item in map");
        while (true) {
        }
    }
}

public class HazelcastTest2 {

    static public void main(String[] args) {
        Config config = new Config();
        config.getNetworkConfig().setPort(5701);
        config.getNetworkConfig().setPortAutoIncrement(false);
        config.setInstanceName("hztest");
        HazelcastInstance hz = Hazelcast.getOrCreateHazelcastInstance(config);
        Map<String,String> mp = hz.getMap("vcutest");
        System.out.printf("map value = %s%n", mp.get("test1"));
    }
}

当我启动第二个实例(第一个已经运行)时,抛出以下异常:

  

线程中的异常&#34; main&#34; com.hazelcast.core.HazelcastException:端口   [5701]已在使用中并且禁用了自动增量。 Hazelcast   无法开始。

2 个答案:

答案 0 :(得分:3)

您可以使用Hazelcast::getHazelcastInstanceByName检索同一个实例,但这要求两个webapp类加载器都可以看到这些类。您可以通过将JAR文件放在tomcat lib目录中来实现这一目的。

除此之外,Hazelcast不是设计为在单实例模式下运行,这不会很好。

答案 1 :(得分:1)

如果您正在部署两个单独的WAR,尽管它们位于相同的JVM中,但它们位于隔离的类加载器中。

您应该将它们视为单独的JVM并按预期使用Hazelcast(让每个Web应用加入群集)

在这种情况下,启用端口自动增量,这应该允许它加入相同的Hazelcast实例