2009-10-28 17 views
6

Sto cercando di utilizzare le API di modifica couchdb (continue) da Java e scoprire che dopo aver esaurito l'elenco delle modifiche correnti il ​​flusso sembra essere chiuso, non rimanere aperto per sempre come previsto.Come si usano le modifiche alle modifiche di CouchDB Modifiche continue da Java?

Il codice che sto utilizzando è di seguito. Mi aspetterei di non abbandonare mai il ciclo while, ma facciamo non appena le modifiche attualmente esistenti sono finite in streaming. Sono relativamente nuovo sia su couchdb che su Java, quindi potrebbe mancare qualcosa di ovvio. Qualcuno può mostrarmi come scrivere correttamente?

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(); 

risposta

7

In realtà esiste un timeout predefinito di 60000ms (60 secondi), a meno che non sia fornito un valore di timeout o un heartbeat. Ho aggiornato lo _changes wiki page in ottobre e ho incluso tutti i valori di default che ho trovato nel codice.

L'impostazione del battito cardiaco significa in sostanza che si sta guardando per un timeout nel client, vale a dire nessuna riga di comando per il periodo di heartbeat significa che hai definitivamente perso la connessione. Credo che CouchDB disabiliti il ​​controllo del timeout se c'è un battito cardiaco.

In ogni caso, è probabile che ci si aspetti che la connessione venga chiusa ad un certo punto e codice per quella condizione.

0

Questa è solo una supposizione in quanto non so abbastanza circa l'attuazione CouchDB continuousfeed o l'implementazione HttpURLConnection. Ma sembra che non ci siano errori nel codice dei due che se il tuo client di connessione java ha un timeout impostato inferiore all'impulso di default per le modifiche continue di couchdb, la connessione potrebbe essere terminata dal client java.

Solo un pensiero.

3

È possibile utilizzare &heartbeat=1000 per ottenere couchdb l'invio di nuove linee sul filo ogni secondo. Ciò manterrà la connessione aperta fino alla disconnessione e/o alla chiusura di CouchDB.

Ma hai ragione, mi sarei anche aspettato che la connessione non si chiudesse - sembra come se anche conn.setReadTimeout(0); non aiuti nulla.

+0

Ho aperto un difetto qui: https://issues.apache.org/jira/browse/COUCHDB-580 – Joscha

Problemi correlati