2009-10-28 1 views
6

Ich versuche, die Couchdb (kontinuierliche) Änderungen API von Java zu verwenden und finde, dass nach dem Erschöpfen der Liste der aktuellen Änderungen der Strom scheint geschlossen zu sein, nicht für immer offen zu bleiben, wie es soll.Wie benutzt man CouchDB Change Notifications Kontinuierliche Änderungen von Java?

Der Code, den ich verwende, ist unten. Ich würde erwarten, niemals aus der while-Schleife auszusteigen, sondern sobald die aktuell bestehenden Änderungen beendet sind. Ich bin relativ neu sowohl auf Couchdb als auch auf Java, daher kann etwas offensichtliches fehlen. Kann mir jemand zeigen, wie man das richtig schreibt?

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

Antwort

7

Es gibt ein Standard-Zeitlimit von 60000ms (60 Sekunden), es sei denn, ein anderer Timeout-Wert oder ein Heartbeat wird angegeben. Ich aktualisierte die _changes wiki page zurück im Oktober und enthielt alle Standardeinstellungen, die ich im Code fand.

Wenn Sie den Heartbeat einstellen, bedeutet das, dass Sie im Client nach einem Timeout Ausschau halten, d. H. Kein Newline für den Heartbeat-Zeitraum bedeutet, dass Sie Ihre Verbindung definitiv verloren haben. Ich glaube CouchDB deaktiviert seine Timeout-Prüfung, wenn es einen Herzschlag gibt.

In jedem Fall sollten Sie wahrscheinlich erwarten, dass die Verbindung an einem bestimmten Punkt geschlossen wird und für diesen Zustand codiert wird.

0

Dies ist nur eine Vermutung, da ich über die couchdb continuousfeed Implementierung oder die HttpURLConnection Implementierung genug wissen, um nicht. Aber es scheint, dass alle Fehler im Code der beiden ausgeschlossen sind, dass, wenn Ihr Java-Verbindungs-Client eine Zeitüberschreitung hat, die niedriger ist als der Standard-Heartbeat für kontinuierliche Änderungen von Couchdb, dann könnte die Verbindung vom Java-Client beendet werden.

Nur ein Gedanke.

3

Sie können &heartbeat=1000 verwenden, um couchdb jede Sekunde neue Zeilen über das Kabel zu senden. Dadurch bleibt Ihre Verbindung offen, bis Sie die Verbindung trennen und/oder CouchDB heruntergefahren wird.

Aber Sie haben Recht, ich hätte auch erwartet, dass die Verbindung nicht schließt - scheint, als ob auch conn.setReadTimeout(0); nichts hilft.

+0

Ich habe einen Fehler hier geöffnet: https://issues.apache.org/jira/browse/COUCHDB-580 – Joscha