【问题标题】:Hazelcast instance by server and not by warHazelcast实例由服务器而不是战争
【发布时间】:2016-08-06 12:48:35
【问题描述】:

我的本​​地机器上有两台 tomcat 服务器,每台服务器上有“n”次战争。

我只想通过服务器获得一个 Hazelcast 实例,但我只通过 WAR 获得 1 个实例,同时使用 Singleton Wrapper,因为这个单例是“附加”到 WAR 类加载器....

有什么简单的方法吗?

  1. Tomcat 服务器的一个 Hazelcast 实例(希望在 Oracle Weblogic 中使用相同的方法),以及一个共享的 hazelcast 实例在所有战争中进入同一服务器。 JVM只有一个节点

  2. 那些 Hazelcast 实例仅加入一个集群。

我不明白的一件事是,如果我在一个 WAR 中创建一个 HazelCast 实例,并尝试进入另一个 WAR,这是空的..是同一个进程 (JVM ...)。

类似这样的:

@Slf4j
public class MyCustomHazelCastManager {

    public static  void debugInstances() {
        Set<HazelcastInstance>  debugginIsntances  = Hazelcast.getAllHazelcastInstances();
        log.debug("Current Instances:" + debugginIsntances.size());;
        for (HazelcastInstance i : debugginIsntances ) {
            log.debug(i.getName());
        }
    }

    public static HazelcastInstance getInstance() {     
        log.debug("MyCustomHazelCastManager.getInstance() for {}" , ManagementFactory.getRuntimeMXBean().getName());        
        HazelcastInstance instance =
                Hazelcast.getHazelcastInstanceByName(ManagementFactory.getRuntimeMXBean().getName());
        if (instance == null) {
            Config config = new Config();       
            log.debug("RuntimeProcess ID :" +ManagementFactory.getRuntimeMXBean().getName());
            config.setInstanceName(ManagementFactory.getRuntimeMXBean().getName());
            instance = Hazelcast.newHazelcastInstance(config);  
            log.debug("Create Hazelcast instance with name:"+  ManagementFactory.getRuntimeMXBean().getName() );
        } else {
            System.out.println("\n\n Warning ! there is one instance with name :{}"+ManagementFactory.getRuntimeMXBean().getName());

        }
        return instance;
    }

}

为什么 Hazelcast.getHazelcastInstanceByName() 不起作用??????

更新:

如果将 HazelCast 库放在 Tomcat 类路径上,(例如 lib 目录)可以正常工作。

所以,我推断要获取 Hazelcast 实例,使用的是活动进程和 Hazelcast 对象使用的类加载器。如果在 Tomcat 上(在同一虚拟机上)部署的不同 WAR 中,让不同的 Hazelcast 库(由 WAR)发生这种战争,Hazelcast 将尝试创建新实例,即使它是同一个进程

【问题讨论】:

    标签: tomcat hazelcast weblogic-10.x


    【解决方案1】:

    您需要使用 hazelcast 客户端连接到 hazelcast 服务器。您需要将 hazelcast 服务器节点作为可运行的 jar 文件(在不同的服务器节点上)运行 - 并且必须将它们配置为在其网络接口上托管并连接到运行 hazelcast 节点的所有其他服务器主机,以形成 hazelcast 集群。 hazelcast 客户端可以连接到这个集群(您可以在 hazelcast 客户端 xml 文件中指定,或者通过 Hazelcast API 执行此操作)。您可以使用枚举来创建返回 hazelcast 客户端实例的单例 - 通过枚举获取对此 hazelcast 客户端的引用。您可以根据需要在尽可能多的 Java 进程上使用此客户端。

    【讨论】:

    • 我正在尝试将 JVMPID (stackoverflow.com/questions/35842/…) 附加到 HazelCastInstance,方法是将此 PID 设置为 HazelCastInstance Config 的唯一标识符,因此属于同一服务器的不同战争应该共享相同的 Hazelcast 实例。 .但是当我尝试按名称获取实例时,没有人返回...(Hazelcast.getHazelcastInstanceByName)
    • 你为什么要这样做?只需为每个进程获取一个客户端连接实例。这就是这样做的方法。
    • 这就是我想要做的:每个进程一个连接实例。在这种情况下,正在运行的进程是 tomcat 运行实例,但无法获取“每个进程的 hazelcast 实例”。我不能使用单例模式,因为会有很多实例作为 WAR 类加载器(我不想在 tomcat lib 中使用外部类),所以我想使用 Hazelcast.getHazelcastInstanceByName() 来获取 Hazelcast 实例,但没有人是返回.....
    【解决方案2】:

    正如更新条目中所说,只是为了在 Tomcat、Weblogic、任何服务器、启动类路径库上拥有 Hazelcast 库...:

    我推断,为了获取 Hazelcast 实例,使用了活动的 Hazelcast 对象使用的进程和类加载器。如果在一个 Tomcat 上部署的不同 WAR(在同一虚拟机上), 有这场战争不同的 Hazelcast 库(由 WAR) Hazelcast 将尝试创建新实例,即使它是同一个进程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多