Chr*_*ris 4 mongodb mongodb-java
我使用的是 Java mongodb 驱动程序版本 3.8.0 和 mongodb 3.6.3。
我用这个在一个集合上创建了一个手表:
MongoCursor<ChangeStreamDocument<Document>> cursor = collection.watch().maxAwaitTime(500, TimeUnit.MILLISECONDS).iterator();
Run Code Online (Sandbox Code Playgroud)
此处的文档说明了 maxAwaitTime:
服务器等待新文档以满足更改流查询的最长时间。
但是,我看到的是 cursor.hasNext() 仅在集合发生更改时返回,而不是在传递给 maxAwaitTime 的时间已过时返回。
当我打开 mongodb 的详细日志记录时,我看到 maxWaitTime 在 getMore 命令中按预期设置。
没有更改时,如何使我的手表超时?似乎 maxAwaitTime 应该这样做。为什么不起作用?
MongoDB 驱动程序将更改流实现为 TAILABLE_AWAIT 游标的抽象,并maxAwaitTimeMS为TAILABLE_AWAIT 游标上的getMore命令指定时间限制。
它的工作方式是,MongoCursor继续getMore循环向服务器发送命令,直到:
只有当上述任何事件发生时,游标的方法next()或hasNext()才会返回。
虽然上述事件均未发生,但服务器的getMore命令将继续由Iterator接口调用。在maxAwaitTime指定等待多久前的getMore命令超时等待的文件,并返回即使没有找到的文档。
没有更改时,如何使我的手表超时?
如果您的应用程序在 之后需要超时maxAwaitTime,则mongo-java-driver 在 上提供tryNext()方法MongoCursor。null如果没有找到文档,这个方法会在 maxAwaitTime 之后返回,并且可以被应用程序重复调用。另请参阅JAVA-2965。