【问题标题】:How to override replace function in hazelcast IMap?如何覆盖 hazelcast IMap 中的替换功能?
【发布时间】:2018-01-12 04:33:23
【问题描述】:

我有一个 hazelcast IMap,我在其中覆盖了加载、存储等其他功能,以便在我的 MongoDB 数据库中也进行备份。因此,当 hazelcast IMap 有一个补充时,MongoDB 中也会进行相应的备份。但是如何覆盖替换功能?我希望每当 hazelcast 地图的现有条目有更新时,相应的 MongoDB 文档也应该有更新。

编辑:这是我的 store 方法的代码

public void store(Key key, Doc value) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String json = objectMapper.writeValueAsString(value);
            BasicDBObject document = (BasicDBObject) JSON.parse(json);
            this.collection.insertOne(new Document(document));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

我正在使用 MapStore 并覆盖加载、存储等功能,以在 MongoDB 上启用备份。现在我有一个 MongoDB 集合,其中包含带有自动生成的 id 的条目。然而,我的 hazelcast 地图会获取 5 个字段并创建一个关键对象,并存储与关键对象对应的文档。该映射基本上是<Key, Doc> 格式,其中 Key 本身是一个包含五个字段的类。

所以当我使用替换功能时,(map.replace(Key, Doc)),与 Key 对应的 Doc 在 hazelcast 映射中更新,但 MongoDB 插入另一个文档,其 id 作为一些系统参数(如时间戳等)的组合,值为正确的文件。但是我希望它更新相同的条目,但是我应该在哪里指定 mongodb 的代码以从文档中获取“id”字段并更新该文档本身?

编辑 2:

我意识到我需要更新 store 函数以使其搜索具有相同 id 的现有文档并更新它,如果它不存在则插入它。现在的问题是,当 hazelcast 尝试调用 store 函数时,我获得的 id 完全不同,是时间戳、机器标识符、进程标识符等的组合。为什么会这样?

当我从地图中获取对象时,它具有 mongodb 的 id,但是当我修改然后将其插入回来时,它具有不同的 id?

【问题讨论】:

    标签: mongodb hazelcast mongo-java hazelcast-imap


    【解决方案1】:

    @shagufta-oliveyu-methwani,你能澄清一下override the replace function 的意思吗?

    我相信您有一个 MapStore 可以从后端存储加载/存储数据。如果是这种情况,当您调用 map.update 时,您的 MapStore store 方法将在数据存储到 Hazelcast 地图之前被调用。

    请查看相关文档:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#loading-and-storing-persistent-data

    您可以在此处找到示例项目:https://github.com/hazelcast/hazelcast-code-samples/tree/master/distributed-map/mapstore

    如果您没有使用 MapSore,这是将 Hazelcast 地图与 3rd 方数据存储交互的正确方法。

    【讨论】:

    • @shagufta-oliveyu-methwani,Hazelcast 只需使用您提供给replace 方法的密钥和文档调用 store 方法。除此之外,如何插入/更新底层数据源取决于您。你能确认replace方法和store方法中的idKeyDoc对象是一样的吗?另外,您能否分享修改后的store 方法,因为您需要使用insertOne 以外的其他方法来更新MongoDB 中的现有数据?
    • 好吧,没关系,这已经解决了,问题在于杰克逊将对象转换为 json。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多