¿Cómo se utilizan los cambios continuos de notificaciones de cambio de CouchDB desde Java?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Estoy intentando usar la API de cambios de couchdb (continua) de Java y descubro que después de agotar la lista de cambios actuales, la secuencia parece estar cerrada, no permanecer abierta para siempre como se supone que debe hacerlo.

El código que estoy usando está debajo. Esperaría nunca abandonar el ciclo while, pero lo hago tan pronto como se terminen de transmitir los cambios actualmente existentes. Soy relativamente nuevo tanto en couchdb como en Java, por lo que me puede faltar algo obvio. ¿Alguien puede mostrarme cómo escribir esto correctamente?

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();
¿Fue útil?

Solución

En realidad, hay un tiempo de espera predeterminado de 60000 ms (60 segundos) a menos que se proporcione un valor de tiempo de espera diferente o un latido. Actualicé la _changes wiki page en octubre e incluí cualquier defecto que encontré en el código .

Establecer el latido básicamente significa que estará esperando un tiempo de espera en el cliente, es decir, no hay una nueva línea para el período de latido significa que definitivamente ha perdido su conexión. Creo que CouchDB desactiva su tiempo de espera si hay un latido.

En cualquier caso, es probable que espere que la conexión se cierre en algún momento y el código para esa condición.

Otros consejos

Puede usar & amp; heartbeat = 1000 para hacer que couchdb envíe nuevas líneas por cable cada segundo. Eso mantendrá su conexión abierta hasta que se desconecte y / o CouchDB se apague.

Pero tiene razón, también hubiera esperado que la conexión no se cerrara, parece que también conn.setReadTimeout (0); no ayuda nada.

Esto es solo una suposición ya que no sé lo suficiente sobre la implementación de alimentación continua de couchdb o la implementación de HttpUrlConnection. Pero parece excluir cualquier error en el código de los dos que si su cliente de conexión java tiene un tiempo de espera establecido más bajo que el latido predeterminado para cambios continuos de couchdb, entonces la conexión podría ser terminada por el cliente java.

Solo un pensamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top