我使用如下配置运行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客户端中更新它。
谢谢和问候,哈里
发布于 2015-06-15 13:57:21
显然,您类使用自定义序列化,因此需要工厂。我使用Spring而不是运行时配置,也不必配置序列化--直到我开始使用优化的Portable而不是Java的标准Serializable。
切换到Serializable将解决您的问题,但自定义序列化更好--速度是java.io.Serializable的两倍。不幸的是,您需要对其进行配置。
顺便说一句,这适用于任何Hazelcast配置。它应该在集群中的任何地方都是完全相同的。也许有一天,他们会取消对瘦客户端的要求。你将如何实现这样的东西?使用Spring或Hazelcast自己的XML的一个原因是将其放在某个共享位置,或者通过Maven包含在每个JAR/WAR中。
您在这里提到了另一个问题:版本控制和兼容性。通常,我会避免在不同的集群节点上使用同一个类的不同版本。虽然Hazelcast可以通过自定义序列化来处理它(如果我没有弄错的话,是可移植的)。
在任何情况下,如果您坚持使用Java进行初始化,那么可以使用一个XML配置或一个基类(方法等)来初始化代码。将它放在某个JAR中,到处引用它(作为Maven依赖项),问题就解决了。
发布于 2020-06-29 18:36:13
关键是要知道Hazelcast尝试识别对象的序列化类型的顺序
当Hazelcast序列化对象时:
如果上述检查失败,则Hazelcast将检查它是com.hazelcast.nio.serialization.DataSerializable还是com.hazelcast.nio.serialization.IdentifiedDataSerializable.的实例
如果上述检查失败,则
,否则Hazelcast不会自动下载它们
有关更多信息,请参阅参考手册Here
https://stackoverflow.com/questions/29257325
复制相似问题