我使用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。