【问题标题】:Connecting to hazelcast server from hazelcast client从 hazelcast 客户端连接到 hazelcast 服务器
【发布时间】:2015-03-25 13:38:59
【问题描述】:

我的 hazelcast 服务器运行配置如下,

Config config = new Config();

// **MapConfig**

config.setMapConfigs(getMapConfig());

// **Serialization factory**

config.setSerializationConfig(getSerializableFactory());

在这种情况下,当 hazelcast 服务器在远程机器上运行时,我必须从 hazelcast 客户端连接到我的 hazelcast 服务器。

但是当我尝试通过 Hazelcast 客户端连接时,

ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().addAddress(IP:PORT);

能够连接到 Hazelcast 服务器,

但是当我得到 map hazelcast.getMap(test).values() 时,它显示异常,它期望我在 hazelcast 客户端配置中配置序列化工厂,

所以当我添加序列化工厂类指向 bean 的序列化配置时

clientConfig.setSerializationConfig(getSerializableFactory());

效果很好,

那么有没有一种方法可以在不使用序列化配置的情况下连接到 Hazelcast 服务器。 原因是如果我将在 hazelcast 服务器(在远程位置)中更新的 bean 发生任何变化,我也必须在我的 hazelcast 客户端中更新它。

感谢和问候, 哈利

【问题讨论】:

    标签: java client-server javabeans remote-server hazelcast


    【解决方案1】:

    显然您的类使用自定义序列化,因此需要该工厂。我使用 Spring 而不是运行时配置,并且我不必配置序列化 - 直到我开始使用优化的 Portable 而不是 Java 的标准 Serializable。

    切换到 Serializable 将解决您的问题,但自定义序列化很好 - 比 java.io.Serializable 快两倍。不幸的是,您需要对其进行配置。

    顺便说一句,这适用于任何 Hazelcast 配置。它应该在整个集群的任何地方都完全相同。也许有一天他们会取消对瘦客户端的这一要求。你将如何实现这样的事情?使用 Spring 或 Hazelcast 自己的 XML 的一个原因 - 将其放在某个共享位置或通过 Maven 包含在每个 JAR/WAR 中。

    您在这里触及了另一个问题:版本控制和兼容性。一般来说,我会避免在不同的集群节点上使用同一类的不同版本。虽然 Hazelcast 可以通过自定义序列化来处理它(如果我没记错的话是便携式的)。

    在任何情况下,如果您坚持使用 Java 进行初始化代码,则需要一个 XML 配置或一个基类(方法等)。把它放在一些 JAR 中,到处引用它(作为 Maven 依赖项),问题就解决了。

    【讨论】:

      【解决方案2】:

      了解 Hazelcast 尝试识别对象的序列化类型的顺序是关键

      当 Hazelcast 序列化一个对象时:

      1. 它首先检查对象是否为空。

      2. 如果上面的检查失败,那么 Hazelcast 会检查它是否是一个实例 com.hazelcast.nio.serialization.DataSerializable 或 com.hazelcast.nio.serialization.IdentifiedDataSerializable。

      3. 如果上面的检查失败,那么 Hazelcast 会检查它是否是一个实例 com.hazelcast.nio.serialization.Portable.

      4. 如果上面的检查失败,那么 Hazelcast 会检查它是否是一个实例 一种默认类型(参见序列化章节 默认类型的介绍)。

      5. 如果上述检查失败,则 Hazelcast 会查找用户指定的 自定义序列化器,即 ByteArraySerializer 的实现或 流序列化器。使用输入搜索自定义序列化程序 Object 的 Class 及其父类,直到 Object。如果父类 搜索失败,类实现的所有接口也都是 检查(不包括 java.io.Serializable 和 java.io.Externalizable)。

      6. 如果上面的检查失败,那么 Hazelcast 会检查它是否是一个实例 java.io.Serializable 或 java.io.Externalizable 和 Global 序列化程序未注册 Java 序列化覆盖 功能。

      7. 如果上述检查失败,Hazelcast 使用注册的 Global 序列化器(如果存在)。

      8. 如果上述所有检查均失败,则序列化失败。当一个 类实现多个接口,以上步骤很重要 确定 Hazelcast 使用的序列化机制。 当一个 任何这些序列化都需要类定义,您 需要在您的应用程序上拥有应用程序所需的所有类 类路径,因为 Hazelcast 不会自动下载它们, 除非您使用的是用户代码部署。

      更多信息请参考参考手册Here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多