从hazelcast客户端连接到hazelcast服务器

时间:2015-03-25 13:38:59

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

我使用配置运行hazelcast服务器,如下所示,

Config config = new Config();

// MapConfig

config.setMapConfigs(getMapConfig());

// 序列化工厂

config.setSerializationConfig(getSerializableFactory());

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

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

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

能够连接到Hazelcast服务器,

但是当我得到地图[ hazelcast.getMap(test).values()]时,它显示了在hazelcast客户端配置中期望我配置seralization工厂的异常,

所以当我添加序列化配置[Which has Serialization factory class pointing to beans]

clientConfig.setSerializationConfig(getSerializableFactory());

一切正常,

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

谢谢和问候, 哈利

2 个答案:

答案 0 :(得分:0)

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

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

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

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

在任何情况下,如果您坚持在Java中使用初始化代码,那么有一个XML配置或一个基类(方法,无论如何)。把它放在一些JAR中,随处引用(作为Maven依赖),问题解决了。

答案 1 :(得分:0)

关键是要知道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的实现或 StreamSerializer。使用输入搜索自定义序列化程序 对象的类及其父类,直到对象。如果是家长班 搜索失败,该类实现的所有接口也都 已选中(不包括java.io.Serializable和java.io.Externalizable)。

  6. 如果上述检查失败,则Hazelcast会检查它是否为实例 java.io.Serializable或java.io.Externalizable和一个Global 序列化器未向Java序列化覆盖注册 功能。

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

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

有关更多信息,请参阅参考手册Here