我正在使用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应该执行此操作。为什么不起作用?
答案 0 :(得分:2)
MongoDB驱动程序将更改流实现为TAILABLE_AWAIT游标的抽象,maxAwaitTimeMS
用于为TAILABLE_AWAIT游标上的getMore命令指定时间限制。
工作方式,MongoCursor继续循环向服务器发送getMore
命令,直到其中一个:
仅当上述任何事件发生时,游标的方法next()或hasNext()才会返回。
尽管以上所有事件均未发生,但是getMore
接口将继续调用服务器的Iterator
命令。 maxAwaitTime
指定在等待文档并返回getMore
命令超时之前等待的时间,即使没有找到文档也是如此。
在没有任何更改的情况下,如何使手表超时?
如果您的应用要求在maxAwaitTime
之后超时,则mongo-java-driver在MongoCursor
上提供tryNext()方法。如果未找到文档,此方法将在maxAwaitTime之后返回null
,并且可以由应用程序重复调用。另请参见JAVA-2965。