Как переопределить функцию замены в Hazelcast IMap?

У меня есть IMap hazelcast, в котором я переопределил загрузку, хранение и т. Д., Другие функции, так что резервная копия также выполняется в моей базе данных MongoDB. Таким образом, когда есть дополнение к IMap hazelcast, в MongoDB также создается соответствующая резервная копия. Но как мне переопределить функцию замены? Я хочу, чтобы всякий раз, когда происходит обновление существующей записи карты hazelcast, должно быть обновление и в соответствующем документе 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, в которой есть записи с автоматически сгенерированными идентификаторами. Однако моя карта hazelcast извлекает 5 полей и создает ключевой объект и сохраняет документ, соответствующий ключевому объекту. Карта в основном имеет формат <Key, Doc>, где сам ключ представляет собой класс из пяти полей.

Поэтому, когда я использую функцию замены (map.replace(Key, Doc)), документ, соответствующий ключу, обновляется на карте hazelcast, но MongoDB вставляет другой документ с идентификатором в виде комбинации некоторых системных параметров, таких как временная метка и т. Д., И значение в качестве правильного документа. Однако я хочу, чтобы он обновил ту же запись, но где мне указать код для mongodb, чтобы получить поле «id» из документа и обновить сам этот документ?

Изменить 2:

Я понял, что мне нужно обновить функцию хранилища, чтобы она выполняла поиск существующего документа с тем же идентификатором и обновляла его, если он не существует, вставьте его. Теперь вопрос в том, что идентификатор, который я получаю, когда hazelcast пытается вызвать функцию хранилища, совершенно другой, это комбинация отметки времени, идентификатора машины, идентификатора процесса и т. Д. Почему это так?

Когда я получаю объект с карты, у него есть идентификатор, который был у mongodb, но когда я изменяю, а затем вставляю его обратно, у него другой идентификатор?


person Shagufta Oliveyu Methwani    schedule 12.01.2018    source источник


Ответы (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 со сторонним хранилищем данных.

person Gokhan Oner    schedule 14.01.2018
comment
@ shagufta-Oliveyu-methwani, Hazelcast просто вызывает метод store с ключом и документом, который вы предоставили методу replace. В остальном, как вставлять / обновлять базовый источник данных зависит от вас. Можете ли вы подтвердить, что объекты id Key и Doc в replace методе и внутри store методов одинаковы? Кроме того, можете ли вы поделиться модифицированным методом store, поскольку вам нужно использовать другой метод, отличный от insertOne, для обновления существующих данных внутри MongoDB? - person Gokhan Oner; 16.01.2018
comment
Хорошо, неважно, что это решено, проблема заключалась в преобразовании объекта Джексоном в json. - person Shagufta Oliveyu Methwani; 16.01.2018