2009-10-28 15 views
6

Estoy tratando de usar el API de cambios couchdb (continuo) de Java y encuentro que después de agotar la lista de cambios actuales, la transmisión parece estar cerrada, no permanecer abierta para siempre como se supone que debe.¿Cómo se usa CouchDB Change Notifications Continuous Changes from Java?

El código que estoy usando está por debajo. Esperaría nunca abandonar el ciclo while, pero hacerlo tan pronto como los cambios actualmente existentes se terminen de transmitir. Soy relativamente nuevo tanto para couchdb como para Java, por lo que puede que falte algo obvio. ¿Alguien puede enseñarme 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(); 

Respuesta

7

En realidad hay un tiempo de espera predeterminado de 60000ms (60 segundos) a menos que se proporcione un valor de tiempo de espera diferente o un latido del corazón. Actualicé el _changes wiki page en octubre e incluí los valores predeterminados que encontré en el código.

Configurar el latido del corazón básicamente significa que estará pendiente de un tiempo de espera en el cliente, es decir, que no haya una nueva línea para el período de latido cardíaco significa que definitivamente ha perdido la conexión. Creo que CouchDB desactiva su verificación de tiempo de espera si hay un latido.

En cualquier caso, probablemente deba esperar que la conexión se cierre en algún momento y codificar para esa condición.

0

Ésta es sólo una suposición, ya que no sé lo suficiente sobre la aplicación couchdb continuousfeed o la implementación 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 configurado más bajo que el latido predeterminado para los cambios continuos de couchdb, entonces la conexión podría ser rescindida por el cliente java.

Solo un pensamiento.

3

Puede usar &heartbeat=1000 para 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 cierre.

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

+0

He abierto un defecto aquí: https://issues.apache.org/jira/browse/COUCHDB-580 – Joscha