При использовании Java-драйвера mongodb maxAwaitTime не работает в потоке изменений - PullRequest
0 голосов
/ 09 сентября 2018

Я использую драйвер Java mongodb версии 3.8.0 и mongodb 3.6.3.

Я создал часы для коллекции с этим:

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

Документация здесь сообщает о maxAwaitTime:

Максимальное время ожидания сервером новых документов для удовлетворения запроса потока изменений.

Тем не менее, я вижу, что cursor.hasNext () возвращается, только если в коллекции есть изменения, а не по истечении времени, переданного maxAwaitTime.

Когда я включаю подробное ведение журнала mongodb, я вижу maxWaitTime, установленный, как и ожидалось, в команде getMore.

Как заставить мои часы отключаться, когда нет изменений? Кажется, что maxAwaitTime должен сделать это. Почему это не работает?

1 Ответ

0 голосов
/ 11 сентября 2018

Драйверы MongoDB реализуют поток изменений как абстракцию курсора TAILABLE_AWAIT, а maxAwaitTimeMS - для указания ограничения времени для команды getMore , включенной для курсора TAILABLE_AWAIT.

Как это работает, MongoCursor продолжает отправлять команду getMore в цикле до тех пор, пока:

  • Документ найден
  • Курсор закрыт
  • Исключение происходит

Только когда произойдет любое из указанных выше событий, вернется метод курсора next () или hasNext () .

Хотя ни одно из перечисленных выше событий не происходит, серверная команда getMore будет по-прежнему вызываться интерфейсом Iterator. maxAwaitTime указывает время ожидания до истечения времени ожидания команды getMore при ожидании документов и возвратах, даже если там не найдено никаких документов.

Как сделать так, чтобы часы перестали работать при отсутствии изменений?

Если вашему приложению требуется время после maxAwaitTime, mongo-java-driver предлагает метод tryNext () для MongoCursor. Этот метод вернет null после maxAwaitTime, если документы не найдены, и может вызываться приложением повторно. Смотрите также JAVA-2965 .

...