在hazelcast管理中心控制台上获取SerializationException,其中自定义对象用作映射中的键值

时间:2017-04-19 06:21:31

标签: hazelcast

我在Hazelcast群集中创建了一个地图。我可以看到Hazelcast管理中心UI上的条目数量增加了我的地图。在控制台上我也可以使用m.size命令获取大小。

我知道对于像Integer和String这样的原始包装类我可以使用m.get命令来查看任何键的值。我使用自定义对象作为map的键和值,因此我无法在控制台上使用m.keys或m.values命令。

它使HazelcastSerializationException出错。我应该在Hazelcast管理中心更改什么才能在控制台上反序列化数据?

我使用hazelcast版本3.8.1并使用startManCenter.bat脚本在mancenter目录中运行Hazelcast管理中心。

我想知道Hazelcast管理中心将如何获得自定义课程。我应该将我的类文件或编译的jar复制到Hazelcast管理中心的某个地方,以便它可以获得所需的类吗?

以下是管理中心控制台的日志:

    hazelcast[rules_cache] > m.size
Size = 7
hazelcast[rules_cache] > m.keys
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.rulemanagement.model.RuleCacheKey
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:184)
    at com.hazelcast.client.spi.ClientProxy.toObject(ClientProxy.java:187)
    at com.hazelcast.client.proxy.ClientMapProxy.keySet(ClientMapProxy.java:1047)
    at com.hazelcast.client.console.ClientConsoleApp.handleMapKeys(ClientConsoleApp.java:835)
    at com.hazelcast.client.console.ClientConsoleApp.handleCommand(ClientConsoleApp.java:369)
    at com.hazelcast.client.console.ClientConsoleApp.start(ClientConsoleApp.java:184)
    at com.hazelcast.client.console.ClientConsoleApp.main(ClientConsoleApp.java:1564)
Caused by: java.lang.ClassNotFoundException: com.rulemanagement.model.RuleCacheKey
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:149)
    at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:123)
    at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:522)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219)
    ... 8 more
hazelcast[rules_cache] >

1 个答案:

答案 0 :(得分:2)

我使用的是带有hazelcast-3.8.1 zip包的clientConsole.bat。 它在demo文件夹下。我在该demo文件夹中添加了hazelcast-client.xml文件以连接到远程hazelcast节点。这为我提供了类似于我们在hazelcast管理中心控制台选项卡上看到的控制台。

使用clientConsole.bat的好处是,即使未配置管理中心,我也可以查询通过hazelcast集群创建的地图。

我只能使用m.size命令来查看map是否正在获取新条目。因为我使用自定义类作为键/值对,所以其他命令如m.keys和m.values由于SerializationException而失败。

解决方案:我在hazelcast-3.8.1 \ lib目录中添加了包含这些类的jar,并修改了clientConsole.bat脚本以从lib目录中加载其他jar。现在我可以运行m.keys和m.values命令。