在ChangeStream中收到第一个文档之前,使用MongoDB Java驱动程序获取简历令牌吗?

约翰:

这个问题类似于我如何在第一个文档中恢复MongoDB ChangeStream,不仅是在开始侦听后发生更改,还包括Java驱动程序。afaik,如果需要确保所有文档至少被处理一次,这一点至关重要。

例如,假设我有一个变更流(C),用于订阅文档并根据每个文档的内容发送电子邮件。但是,如果电子邮件发送失败或服务器在发送电子邮件之前崩溃了,则恢复令牌(R)将不会保留。再次启动该应用程序时,它将“监视”没有简历令牌,因此该文档将丢失并且不会发送电子邮件。

是否有一种受支持的方法可以在收到第一个变更文档之前获取ChangeStream的恢复令牌,以减轻上述问题?

MongoDB规范可以看出,驱动程序必须支持这一点:

驱动程序必须公开一种机制来检索将用于自动恢复的相同恢复令牌。

但是我似乎找不到使用Java API做到这一点的方法。这可能吗?还是有建议的解决方法?

请注意,由于时间易碎,并且服务器和客户端上的时钟都可能更改,因此我非常希望不要使用startAtOperationTime基于时间戳的时钟。

D.SM:

在实现规范的“必须公开恢复令牌”规定的与4.2兼容的驱动程序中,每次更改流执行getMore时,都会发生以下两种情况之一:

  • 至少返回一个文档,每个文档在该文档中都包含一个简历令牌,或者
  • 不返回任何文档,在这种情况下,仍由4.0.7+服务器提供postBatchResumeToken。

我记得在Java中,变更流具有tryNext方法,您需要调用该方法来检索postBatchResumeToken而不阻塞应用程序。检索当前恢复令牌(与文档关联的一个令牌或postBatchResumeToken的机制)是特定于驱动程序的。

https://mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync/com/mongodb/client/MongoChangeStreamCursor.html是我能找到的最接近的文档,除了我相信您会使用tryNext而不是next,并且如果tryNext不返回任何文档,您仍将读取当前的简历令牌以提高您在更改流中的位置。

就恢复令牌令牌跟踪而言,https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-change-streams/#resuming-a-change-stream可能会有所帮助,尽管这通常不会根据需要包括try_next(Ruby驱动程序也实现)。

这样一来,您就可以在更改流收到任何文档之前正确地对其进行恢复。您将处理文档存储恢复令牌,因此您需要足够快地取得进展,以确保不脱离oplog,但是postBatchResumeToken处理很长时间没有任何变化而不会脱离oplog的情况。

如果您没有任何恢复令牌,您仍然需要从头开始在时间戳记开始更改流-https: //mongodb.github.io/mongo-java-driver/4.0/apidocs/mongodb-driver-sync /com/mongodb/client/ChangeStreamIterable.html将startAtOperationTime用作我希望您使用的方法。如果您的驱动程序公开了当前的clusterTime,则可能会提供它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB在聚合查询中获取第一个和最后一个文档

从MongoDB中的所有文档中获取数组字段的第一个元素的总和

Mongodb:如何从数据库中获取第一个文档,然后将其删除

如何使用MongoDB的Java驱动程序将许多文档合并为一个文档?

在mongodb中,获取第一个文档和最后一个文档的最有效方法是什么

仅在mongodb集合中获取具有条件的第一个匹配文档

如何使用 Java 驱动程序在 MongoDB 中获取嵌入文档数组的特定值

从文档顺序中获取第一个Firestore文档(Node.js)

通过mongoDB Java驱动程序获取mongoStat

获取第一个定界符之前的第一个单词

从rust中的通道迭代器获取第一个接收到的值

无法使用XML配置运行第一个spring程序。我收到这个错误

使用Java驱动程序获取mongoDB中最后插入的文档的ID

在第一个空格之前获取字符

使用 Linq 解析 XML 文档时仅获取第一个值

MongoDB Java驱动程序:MongoCore驱动程序与MongoDB驱动程序与MongoDB异步驱动程序

在Java中的String之后和第一个分隔符之前替换String

获取单词和空格字符串中的第一个单词-在空格之前对第一个单词进行子字符串化

使用RLE从组中获取第一个和最后一个值

MongoDB Java驱动程序中的死锁

MongoDB:使用Java驱动程序拉

Nodejs Mongodb使用find而不使用聚合获取数组的第一个元素

尝试使用MongoDB Java驱动程序更新文档

使用Java驱动程序更新MongoDB中子字段的值吗?

在java中获取当月的第一个日期

MongoDb C#驱动程序可以与LINQ和动态文档一起使用吗?

运行后我无法使用 Flutter 运行我的第一个应用程序我收到此错误

mongoDB c ++ 11驱动程序获取插入文档的ID

Java驱动程序:如何使用Mongodb的updateFirst方法获取更新后的对象的objectId