Как вы используете CouchDB Уведомления об изменениях Непрерывные изменения от Java?

StackOverflow https://stackoverflow.com/questions/1640653

  •  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-клиентом.

Просто мысль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top