我正在研究POC是否应该继续使用Apache Ignite用于商业和企业用途。有一个用例虽然我们正试图找到答案。
动态创建表格,即可能会有新字段放入缓存中。意味着没有预编译的POJO(Model)定义表/缓存的属性。
我想写一个SELECT连续查询,它给出了修改后的结果。所以我编写了该查询,但问题是当侦听器收到通知时,我无法找到从任何方法调用修改的所有字段名称。我希望能够在某种Map中获取所有字段名称和字段值,我可以使用它然后提交给其他系统。
答案 0 :(得分:1)
您可以使用二进制对象和连续查询跟踪所有已修改的字段值:
IgniteCache<Integer, BinaryObject> cache = ignite.cache("person").withKeepBinary();
ContinuousQuery<Integer, BinaryObject> query = new ContinuousQuery<>();
query.setLocalListener(events -> {
for (CacheEntryEvent<? extends Integer, ? extends BinaryObject> event : events) {
BinaryType type = ignite.binary().type("Person");
if (event.getOldValue() != null && event.getValue() != null) {
HashMap<String,Object> oldProps = new HashMap<>();
HashMap<String,Object> newProps = new HashMap<>();
for (String field : type.fieldNames()) {
oldProps.put(field,event.getOldValue().field(field));
newProps.put(field,event.getValue().field(field));
}
com.google.common.collect.MapDifference<Object, Object> diff = com.google.common.collect.Maps.difference(oldProps, newProps);
System.out.println(diff.entriesDiffering());
}
}
});
cache.query(query);
cache.put(1, ignite.binary().builder("Person").setField("name","Alice").build());
cache.put(1, ignite.binary().builder("Person").setField("name","Bob").build());