Как вы используете CouchDB Уведомления об изменениях Непрерывные изменения от Java?
-
08-07-2019 - |
Вопрос
Я пытаюсь использовать API couchdb (непрерывных) изменений из Java и обнаруживаю, что после исчерпания списка текущих изменений поток, кажется, закрыт, а не остается открытым навсегда, как предполагалось. Р>
Код, который я использую, приведен ниже. Я ожидаю, что никогда не выпаду из цикла while, но сделаю это, как только текущие изменения будут закончены, и будут транслироваться. Я относительно новичок как в couchdb, так и в Java, поэтому могу упустить что-то очевидное. Может кто-нибудь показать мне, как это правильно написать?
URL url = new URL("[path to database here]/_changes?feed=continuous";);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while((line = reader.readLine()) != null){
// do something with the line here
}
// Should never get here under normal circumstances
reader.close();
Решение
На самом деле время ожидания по умолчанию составляет 60000 мс (60 секунд), если не указано другое значение времени ожидания или пульса. Я обновил _changes вики-страницу еще в октябре и включил все значения по умолчанию, с которыми я столкнулся в коде . р>
Установка пульса в основном означает, что вы будете наблюдать за тайм-аутом в клиенте, то есть отсутствие новой строки для периода пульса означает, что вы определенно потеряли соединение. Я полагаю, что CouchDB отключает проверку тайм-аута при наличии пульса.
В любом случае следует ожидать, что в какой-то момент соединение будет закрыто, и код для этого условия.
Другие советы
Вы можете использовать & amp; heartbeat = 1000
, чтобы couchdb отправлял новые линии по проводам каждую секунду. Это будет держать ваше соединение открытым до тех пор, пока вы не отключите и / или CouchDB не будет отключен.
Но вы правы, я бы также ожидал, что соединение не закроется - кажется, что conn.setReadTimeout (0);
ничего не помогает.
Это всего лишь предположение, поскольку я недостаточно знаю о реализации непрерывной подачи couchdb или реализации HttpUrlConnection. Но кажется, что в коде этих двух ошибок есть какие-то ошибки: если у вашего клиента java-соединения установлен тайм-аут ниже, чем пульс по умолчанию для непрерывных изменений couchdb, то соединение может быть прервано java-клиентом.
Просто мысль.