Apache Ignite连续查询:当存在动态字段时,如何在侦听器更新中获取字段名称和字段值?

时间:2018-05-25 15:45:54

标签: sql apache ignite

我正在研究POC是否应该继续使用Apache Ignite用于商业和企业用途。有一个用例虽然我们正试图找到答案。

前提条件

动态创建表格,即可能会有新字段放入缓存中。意味着没有预编译的POJO(Model)定义表/缓存的属性。

用例

我想写一个SELECT连续查询,它给出了修改后的结果。所以我编写了该查询,但问题是当侦听器收到通知时,我无法找到从任何方法调用修改的所有字段名称。我希望能够在某种Map中获取所有字段名称和字段值,我可以使用它然后提交给其他系统。

1 个答案:

答案 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());