我使用Java MangoDB驱动程序3.3.0和MunGDB 3.63.
我用这个在一个收藏中创建了一个手表:

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

文档here说明了maxawaittime:
服务器等待新文档以满足更改流查询的最长时间。
但是,我看到的是cursor.hasnext()只在集合发生更改时返回,而不是在传递给maxawaittime的时间已过时返回。
当我打开MongoDB的详细日志记录时,我看到在getmore命令中设置了maxwaittime。
在没有变化的情况下,如何使手表超时?似乎maxwaittime应该这么做。为什么不起作用?

最佳答案

MongoDB驱动程序将更改流实现为可裁剪的等待游标的抽象,而maxAwaitTimeMS是为可裁剪的等待游标上的getMore命令指定一个时间限制。
按照它的工作方式,MongoCursor继续循环向服务器发送getMore命令,直到:
找到文档
光标关闭
出现异常
只有当发生上述任何事件时,游标的方法next()hasNext()才会返回。
虽然上述事件均未发生,但getMore接口将继续调用服务器的Iterator命令。maxAwaitTime指定在等待文档时,在getMore命令超时之前等待多长时间,并返回,即使没有找到文档。
在没有变化的情况下,如何使手表超时?
如果应用程序需要在maxAwaitTime之后超时,mongo-java-driver提供MongoCursor上的tryNext()方法。如果找不到文档,则此方法将在maxawaittime之后返回null,并且应用程序可以重复调用。另请参见JAVA-2965

09-27 03:53