【发布时间】:2020-03-11 22:15:23
【问题描述】:
我有一个简单的对象,其中包含两个扩展 hazelcast DataSerializable 接口的字段。放入该地图工作正常,但在使用相同名称检索时显示异常:“读取 DataSerializable 时出现问题,命名空间:0,ID:0”。
我正在使用 hazelcast 客户端“3.12.4”和带有最新 docker 基本映像的 hazelcast 集群。
如果你们中的任何人遇到类似的问题,请告诉我?为了简单起见,到目前为止,我还没有使用任何数据库。我的 hazelcast 客户端只在 IMap 中保存一个简单的对象,然后从 IMap 中检索。
请在下面找到我的代码 sn-p:
域对象:
public class Employee implements DataSerializable {
private String name;
private Integer serialNumber;
public Employee() {
}
public Employee(String name, Integer serialNumber) {
this.name = name;
this.serialNumber = serialNumber;
}
** Getter and Setter **
@Override
public void readData(ObjectDataInput in) throws IOException {
this.name = in.readUTF();
this.serialNumber = (Integer) in.readInt();
}
@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeUTF(name);
out.writeInt(serialNumber);
}
Hazelcast 保存并获取:
IMap<String, Employee> map = hazelcastInstance.getMap("employee");
map.put(employee.getName(), employee);
EntryObject e = new PredicateBuilder().getEntryObject();
Predicate predicate = e.get("serialNumber").lessThan(200);
Collection<Employee> result = map.values(predicate);
}
提前感谢您的帮助。
【问题讨论】:
-
你的类有默认构造函数吗? Hazelcast 必须在运行
DataSerializable的readData方法之前创建对象以填充字段。如果您可以发布课程定义,甚至是 mvce,那会很有帮助 -
@NeilStevenson 我在我的域对象中使用默认构造函数。有关详细信息,请在我的帖子中找到代码 sn-p。
-
IMap.get(key)有效吗?您正在搜索,因此需要服务器端的域模型,请参阅github.com/hazelcast/… -
@NeilStevenson 当我尝试按键获取地图值时,它工作正常。上面提到的异常我在这个谓词试图获取小于 200 的序列号时得到,并且在调用 map.values 之后。你的意思是这个域模型类也应该在我的集群端吗?
-
是的,对于
DataSerializable,域模型需要在服务器端可用,以便搜索检查每条记录以确定它是否匹配。你可以尝试将域模型添加到 Docker 容器的类路径并报告回来吗?
标签: spring-boot hazelcast spring-cache hazelcast-imap