在 hazelcast 管理中心控制台上获取 SerializationException,自定义对象用作地图中的键、值
Getting SerializationException on hazelcast management center Console with custom objects used as key, value in map
我在 Hazelcast 集群中创建了一个地图。我可以看到我的地图在 Hazelcast 管理中心 UI 上的条目数增加了。在控制台上,我还可以使用 m.size 命令获取大小。
我知道像 Integer 和 String 这样的原始包装 classes 我可以使用 m.get 命令来查看任何键的值。我使用自定义对象作为地图的键和值,所以我无法在控制台上使用 m.keys 或 m.values 命令。
它给出了 HazelcastSerializationException 错误。我应该在 Hazelcast 管理中心端更改什么以在控制台上反序列化数据?
我使用 hazelcast 版本 3.8.1 和 运行 使用 startManCenter.bat 脚本在 mancenter 目录中的 Hazelcast 管理中心。
我想知道 Hazelcast 管理中心将如何获得自定义 classes。我应该将我的 class 文件或编译的 jar 复制到 Hazelcast 管理中心的某个地方,以便它可以获得所需的 classes 吗?
这是来自管理中心控制台的日志:
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] >
我正在使用随 hazelcast-3.8.1 压缩包提供的 clientConsole.bat。
它在演示文件夹下。我在该演示文件夹中添加了 hazelcast-client.xml 文件以连接到远程 hazelcast 节点。这为我提供了类似于我们在 hazelcast 管理中心控制台选项卡上看到的控制台。
使用clientConsole.bat的好处是即使没有配置管理中心,我也可以查询我在hazelcast集群上创建的地图。
我只能使用 m.size 命令来查看地图是否正在获取新条目。由于我对 key/value 对使用自定义 class,因此 m.keys 和 m.values 等其他命令由于 SerializationException 而失败。
解决方案:我在 hazelcast-3.8.1\lib 目录中添加了包含那些 classes 的 jar,并修改了 clientConsole.bat 脚本以从 lib 目录加载其他 jar。现在我可以 运行 m.keys 和 m.values 命令。
我在 Hazelcast 集群中创建了一个地图。我可以看到我的地图在 Hazelcast 管理中心 UI 上的条目数增加了。在控制台上,我还可以使用 m.size 命令获取大小。
我知道像 Integer 和 String 这样的原始包装 classes 我可以使用 m.get 命令来查看任何键的值。我使用自定义对象作为地图的键和值,所以我无法在控制台上使用 m.keys 或 m.values 命令。
它给出了 HazelcastSerializationException 错误。我应该在 Hazelcast 管理中心端更改什么以在控制台上反序列化数据?
我使用 hazelcast 版本 3.8.1 和 运行 使用 startManCenter.bat 脚本在 mancenter 目录中的 Hazelcast 管理中心。
我想知道 Hazelcast 管理中心将如何获得自定义 classes。我应该将我的 class 文件或编译的 jar 复制到 Hazelcast 管理中心的某个地方,以便它可以获得所需的 classes 吗?
这是来自管理中心控制台的日志:
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] >
我正在使用随 hazelcast-3.8.1 压缩包提供的 clientConsole.bat。 它在演示文件夹下。我在该演示文件夹中添加了 hazelcast-client.xml 文件以连接到远程 hazelcast 节点。这为我提供了类似于我们在 hazelcast 管理中心控制台选项卡上看到的控制台。
使用clientConsole.bat的好处是即使没有配置管理中心,我也可以查询我在hazelcast集群上创建的地图。
我只能使用 m.size 命令来查看地图是否正在获取新条目。由于我对 key/value 对使用自定义 class,因此 m.keys 和 m.values 等其他命令由于 SerializationException 而失败。
解决方案:我在 hazelcast-3.8.1\lib 目录中添加了包含那些 classes 的 jar,并修改了 clientConsole.bat 脚本以从 lib 目录加载其他 jar。现在我可以 运行 m.keys 和 m.values 命令。