以原子方式查询所有收款凭证+监视进一步的更改

时间:2019-06-10 22:27:07

标签: mongodb mongodb-java

我们的Java应用将其配置保存在MongoDB集合中。应用启动时,它将从MongoDB中读取所有配置并将其缓存在Maps中。我们希望使用变更流API来监视配置集合的更新。 因此,在应用启动时,首先我们要获取所有配置,从现在开始-注意是否有任何进一步的更改。
有没有一种简单的方法可以自动执行以下

  1. 获取所有配置(文档)的find()
  2. 启动watch(),它将发送所有进一步的更新

从原子上说,我的意思是-不会丢失任何更新(在1-2之间,有人可以使用新配置更新集合)。

1 个答案:

答案 0 :(得分:0)

为确保没有丢失更新通知,我发现可以使用watch().startAtOperationTime(serverTime)(适用于4.0或更高版本的MongoDB),如下所示。

  1. 使用Document hostInfoDoc = mongoTemplate.executeCommand(new Document("hostInfo", 1))之类的命令查询MongoDB服务器的当前时间。
  2. 查询所有有趣的文档:List<C> configList = mongoTemplate.findAll(clazz);
  3. 从hostInfoDoc中提取服务器时间:BsonTimestamp serverTime = (BsonTimestamp) hostInfoDoc.get("operationTime");
  4. 启动使用保存的服务器时间ChangeStreamIterable<Document> changes = eventCollection.watch().startAtOperationTime(serverTime);配置的变更流

由于1在2开始之前结束,所以我们知道2所返回的文档至少与该服务器时间上的文档相同或更新鲜。并且在此服务器时间上或之后发生的任何更新将通过更改流发送给我们(我不在乎再次运行冗余更新,因为我使用map作为缓存,因此额外的添加/删除不会有什么不同,只要最后一个动作到达)。

我想我也可以使用watch().resumeAfter(_idOfLastAddedDoc)(没有尝试)。由于以下情况,我没有使用此方法:集合为空,并且在获取所有(无)文档之后和开始watch()之前添加了第一个文档。在这种情况下,我没有先前的文档_id用作简历令牌。