Чтобы убедиться, что я не теряю уведомлений об обновлениях, я обнаружил, что могу использовать watch().startAtOperationTime(serverTime)
(для MongoDB 4.0 или более поздней версии) следующим образом.
- Запросить сервер MongoDB для текущего временис помощью такой команды, как
Document hostInfoDoc = mongoTemplate.executeCommand(new Document("hostInfo", 1))
- Запрос всех интересных документов:
List<C> configList = mongoTemplate.findAll(clazz);
- Извлечение времени сервера из hostInfoDoc:
BsonTimestamp serverTime = (BsonTimestamp) hostInfoDoc.get("operationTime");
- Запуск настроенного потока измененийс сохраненным временем сервера
ChangeStreamIterable<Document> changes = eventCollection.watch().startAtOperationTime(serverTime);
Так как 1 заканчивается до 2 запусков, мы знаем, что документы, которые были возвращены 2, были, по крайней мере, такими же или более свежими, чем документы на этом времени сервера.И любые обновления, которые произошли в это или после этого времени сервера, будут отправлены нам потоком изменений (я не хочу снова запускать избыточные обновления, потому что я использую карту в качестве кэша, поэтому дополнительные операции добавления / удаления не будут иметь значенияДо тех пор, пока прибывает последнее действие).
Думаю, я мог бы также использовать watch().resumeAfter(_idOfLastAddedDoc)
(не пробовал).Я не использовал этот подход из-за следующего сценария: коллекция пуста, и первый документ добавляется после получения всех (ни одного) документов и перед запуском watch()
.В этом случае у меня нет предыдущего документа _id
для использования в качестве маркера резюме.