我正在尝试在简单的Web应用程序中实现Hazelcast。
我正在尝试将自定义对象存储到我的Hazelcast地图中,并在我的出价对象类中使用必要的导入实现了Serializable。
import java.io.Serializable;
这是类对象的片段。
public class Bid implements Serializable{
private String bidId;
private String stock;
private int price;
private String userId;
private Date date;
以下是将投标对象存储到地图中的语法,其中newBid是投标对象。
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<String, Bid> mapBids = instance.getMap("bids");
mapBids.put(newBid.getUserId(), newBid);
我的Hazelcast节点已启动并正在运行但是当我查询出价图时,我收到以下错误。
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.Class
NotFoundException: aa.Bid
at com.hazelcast.nio.serialization.DefaultSerializers$ObjectSerializer.r
ead(DefaultSerializers.java:190)
at com.hazelcast.nio.serialization.StreamSerializerAdapter.read(StreamSe
rializerAdapter.java:59)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject(Ser
ializationServiceImpl.java:221)
at com.hazelcast.spi.impl.NodeEngineImpl.toObject(NodeEngineImpl.java:15
6)
at com.hazelcast.map.MapService.toObject(MapService.java:773)
at com.hazelcast.map.proxy.MapProxyImpl.entrySet(MapProxyImpl.java:502)
at com.hazelcast.examples.TestApp.handleMapEntries(TestApp.java:882)
at com.hazelcast.examples.TestApp.handleCommand(TestApp.java:371)
at com.hazelcast.examples.TestApp.start(TestApp.java:187)
at com.hazelcast.examples.TestApp.main(TestApp.java:1641)
Caused by: java.lang.ClassNotFoundException: aa.Bid
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
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.loadClass(ClassLoaderUtil.java:109)
at com.hazelcast.nio.IOUtil$1.resolveClass(IOUtil.java:89)
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.nio.serialization.DefaultSerializers$ObjectSerializer.r
ead(DefaultSerializers.java:185)
... 9 more
对象类与我的Web应用程序位于同一个文件夹中,并带有必要的导入语法,但它没有读取它。我已经将CLASSPATH添加到我的Hazelcast jar文件中。
我是否有任何变量需要在Bid类对象中设置Transient才能使Serializable正常工作?或者我错过了什么?
答案 0 :(得分:4)
在尝试将“MyClass”实例放入相关的iMap时,我遇到了使用远程双节点群集的同样问题。我正在撕扯我的头发,以为我需要分发包含'MyClass'的jar,但意识到问题是hazelcast.xml文件中的定义指定了内存格式的OBJECT ...
<in-memory-format>OBJECT</in-memory-format>
我将此值更改为BINARY,一切都开始有效。
<in-memory-format>BINARY</in-memory-format>
NB。我现在在集群中有许多不同的地图,其中一些被定义为OBJECT,一些被定义为BINARY。
我希望这有助于那里的人!
答案 1 :(得分:3)
如果您在本地运行代码,问题是Hazelcast节点没有相同的类。在控制台中检查并确认以下内容:
成员[1] {
议员[10.17.54.16]:5701这个
}
如果有更多的hazelcast实例正在运行关闭或关闭它们,然后运行该应用程序。
答案 2 :(得分:2)
公共类Bid应该在服务器端定义,也与客户端一起定义