使用mongodb Java驱动程序时,maxAwaitTime在更改流上不起作用

时间:2018-09-08 22:48:01

标签: mongodb mongodb-java

我正在使用Java mongodb驱动程序版本3.8.0和mongodb 3.6.3。

我在收藏品上为此制作了一只手表:

MongoCursor<ChangeStreamDocument<Document>> cursor = collection.watch().maxAwaitTime(500, TimeUnit.MILLISECONDS).iterator();

文档here声明了有关maxAwaitTime的信息:

  

服务器等待新文档以满足变更流查询的最长时间。

但是,我看到的是cursor.hasNext()仅在集合发生更改时才返回,而不是在传递给maxAwaitTime的时间过去时返回。

当我打开mongodb的详细日志记录时,我在getMore命令中看到maxWaitTime已按预期设置。

在没有任何更改的情况下,如何使手表超时?似乎maxAwaitTime应该执行此操作。为什么不起作用?

1 个答案:

答案 0 :(得分:2)

MongoDB驱动程序将更改流实现为TAILABLE_AWAIT游标的抽象,maxAwaitTimeMS用于为TAILABLE_AWAIT游标上的getMore命令指定时间限制。

工作方式,MongoCursor继续循环向服务器发送getMore命令,直到其中一个:

  • 找到了文件
  • 光标已关闭
  • 发生异常

仅当上述任何事件发生时,游标的方法next()hasNext()才会返回。

尽管以上所有事件均未发生,但是getMore接口将继续调用服务器的Iterator命令。 maxAwaitTime指定在等待文档并返回getMore命令超时之前等待的时间,即使没有找到文档也是如此。

  

在没有任何更改的情况下,如何使手表超时?

如果您的应用要求在maxAwaitTime之后超时,则mongo-java-driverMongoCursor上提供tryNext()方法。如果未找到文档,此方法将在maxAwaitTime之后返回null,并且可以由应用程序重复调用。另请参见JAVA-2965