如何在hazelcast IMap中覆盖替换功能?

时间:2018-01-12 04:33:23

标签: mongodb hazelcast mongo-java hazelcast-imap

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

修改:这是我的商店方法的代码

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为一些系统参数的组合,如timestamp等和值作为正确的文件。但是我希望它更新相同的条目,但是我应该在哪里指定mongodb的代码来拾取&#34; id&#34;文档中的字段并更新该文档本身?

编辑2:

我已经意识到我需要更新商店功能,使其搜索具有相同ID的现有文档并更新它,如果它不存在则插入它。现在的问题是,当hazelcast试图调用商店功能时,我获得的id是完全不同的,时间戳,机器标识符,进程标识符等的组合。为什么?

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

1 个答案:

答案 0 :(得分:0)

@ shagufta-oliveyu-methwani,你能澄清store的意思吗?

我相信你有一个MapStore来加载/存储来自后端存储的数据。如果是这种情况,当您致电.submit()时,您的MapStore onsubmit方法将会在存储在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地图与第三方数据存储进行交互的正确方法。