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

Java 从hazelcast客户端连接到hazelcast服务器,java,client-server,javabeans,remote-server,hazelcast,Java,Client Server,Javabeans,Remote Server,Hazelcast,我让hazelcast服务器运行配置,如下所示 Config config = new Config(); // **MapConfig** config.setMapConfigs(getMapConfig()); // **Serialization factory** config.setSerializationConfig(getSerializableFactory()); 在这种情况下,当hazelcast服务器在远程计算机上运行时,我必须从hazelcast客户端连接到

我让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.getMaptest.values时,它会显示一个异常,即它期望我在hazelcast客户端配置中配置seralization工厂

因此,当我添加序列化配置时,它具有指向bean的序列化工厂类

clientConfig.setSerializationConfig(getSerializableFactory());
它很好用

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

感谢和问候,
Harry

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

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

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

您在这里谈到了另一个问题:版本控制和兼容性。通常,我会避免在不同的集群节点上使用同一类的不同版本。如果我没弄错的话,Hazelcast可以用自定义序列化处理它


在任何情况下,只要您坚持用Java来初始化代码,就可以使用一个XML配置或一个基类方法。将它放在某个JAR中,在任何地方引用它作为Maven依赖项,问题就解决了。

关键是要知道Hazelcast尝试识别对象序列化类型的顺序

Hazelcast序列化对象时:

它首先检查对象是否为null

如果上述检查失败,则Hazelcast将检查它是否为实例 com.hazelcast.nio.serialization.DataSerializable或 com.hazelcast.nio.serialization.IdentifiedDataSerializable

如果上述检查失败,则Hazelcast将检查它是否为实例 属于com.hazelcast.nio.serialization.Portable

如果上述检查失败,则Hazelcast将检查它是否为实例 对于其中一种默认类型,请参见序列化一章 默认类型简介

如果上述检查失败,则Hazelcast将查找指定的用户 自定义序列化程序,即ByteArraySerializer或 流序列化程序。使用输入搜索自定义序列化程序 对象的类及其父类直到对象。如果父类 搜索失败,类实现的所有接口也将被删除 选中,不包括java.io.Serializable和java.io.Externalizable

如果上述检查失败,则Hazelcast将检查它是否为实例 java.io.Serializable或java.io.Externalizable和全局 序列化程序未使用Java序列化重写注册 特色

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

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

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