Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ChangeStream中收到第一个文档之前,使用MongoDB Java驱动程序获取resume令牌?_Java_Mongodb - Fatal编程技术网

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

在ChangeStream中收到第一个文档之前,使用MongoDB Java驱动程序获取resume令牌?,java,mongodb,Java,Mongodb,这个问题与Java驱动程序类似,但适用于Java驱动程序。如果需要确保所有文档至少处理一次,那么这一点至关重要 例如,假设我有一个变更流(C),它订阅文档并根据每个文档的内容发送电子邮件。但是,如果电子邮件发送失败或服务器在发送电子邮件之前崩溃,则恢复令牌(R)将不会被持久化。当应用程序再次启动时,它将在没有简历令牌的情况下“监视”,因此文档将丢失,并且不会发送电子邮件 是否有一种受支持的方法可以在收到第一个变更文档之前获取的恢复令牌来缓解上述问题 从我从中可以看出,这必须得到驱动程序的支持:

这个问题与Java驱动程序类似,但适用于Java驱动程序。如果需要确保所有文档至少处理一次,那么这一点至关重要

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

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

从我从中可以看出,这必须得到驱动程序的支持:

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

但我似乎找不到使用JavaAPI实现这一点的方法。这是可能的还是有推荐的解决方法


请注意,我非常不喜欢使用基于时间戳的
startAtOperationTime
,因为时间是脆弱的,服务器和客户端上的时钟都可能更改。

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

  • 返回至少一个文档,每个文档在该文档处包含一个恢复令牌,或者
  • 没有返回任何文档,在这种情况下,postBatchResumeToken仍然由4.0.7+服务器提供
我记得Java change streams中有一个tryNext方法,您需要调用它来检索postBatchResumeToken,而不阻塞应用程序。检索当前恢复令牌(与文档或postBatchResumeToken关联的令牌)的机制是特定于驱动程序的

是我能找到的最接近的文档,除非我相信你会使用tryNext而不是next,如果tryNext没有返回任何文档,你仍然会阅读当前的简历标记,以提升你在变更流中的位置

虽然这不包括try_next(Ruby驱动程序也实现了该功能),但对于恢复令牌跟踪来说可能会很有帮助

这将允许您在变更流收到任何文档之前正确地恢复变更流。处理文档后,您将存储恢复令牌,因此您需要足够快地取得进展,以免从oplog上掉下来,但postBatchResumeToken可以处理长时间没有任何更改而不会从oplog上掉下来的情况

如果您没有任何恢复令牌,那么您仍然需要在一开始就以时间戳启动更改流-将StartOperationTime作为我希望您使用的方法。如果您的驱动程序公开了当前clusterTime,您可能会提供驱动程序跟踪的当前clusterTime