Wie verwenden Sie CouchDB Change Notifications Kontinuierliche Änderungen von Java?

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

  •  08-07-2019
  •  | 
  •  

Frage

Ich versuche, die couchdb zu verwenden (kontinuierlich) ändert API von Java und feststellen, dass nach der Liste der aktuellen Auslassen der Strom ändert scheint geschlossen zu sein, nicht offen bleibt für immer, wie es sollte.

Der Code ich benutze ist unten. Ich würde erwarten, nie aus der while-Schleife fallen, aber tun, sobald die derzeit bestehenden Änderungen fertig sind gestreamt werden. Ich bin relativ neu in beiden couchdb und Java so sein kann offensichtlich etwas fehlt. Kann mir jemand zeigen, wie diese richtig zu schreiben?

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();
War es hilfreich?

Lösung

Es ist eigentlich ein Standard-Timeout von 60000ms (60 Sekunden), es sei denn einen anderer Timeout-Wert oder ein Herzschlag vorgesehen ist. Ich aktualisiert, um die _changes Wikiseite im Oktober und enthalten keine Vorgaben stieß ich auf im Code .

den Herzschlag Einstellung bedeutet im Grunde, dass Sie in dem Client für einen Timeout beobachten werden, das heißt kein Newline für die Herzschlagperiode bedeutet, dass Sie Ihre Verbindung auf jeden Fall verloren haben. Ich glaube, CouchDB seine Timeout Prüfung deaktiviert, wenn es ein Herzschlag ist.

In jedem Fall sollten Sie vielleicht erwarten, dass die Verbindung für diesen Zustand zu einem bestimmten Zeitpunkt und Code geschlossen werden.

Andere Tipps

Sie können &heartbeat=1000 verwenden couchdb Senden neue Linien über den Draht in jeder Sekunde zu bekommen. Das wird halten Ihre Verbindung geöffnet, bis Sie trennen und / oder CouchDB wird geschlossen.

Aber du hast recht, ich würde auch erwarten, dass die Verbindung nicht geschlossen -. Scheint, als ob auch conn.setReadTimeout(0); nichts hilft

Das ist nur eine Vermutung, da ich über die couchdb continuousfeed Implementierung oder die HttpURLConnection Implementierung genug wissen, um nicht. Aber es scheint, vorbehältlich Fehler im Code des beide, dass, wenn Ihre Java-Verbindung Client ein Timeout hat niedriger als der Standardherzschlag für couchdb kontinuierliche Änderungen dann könnte die Verbindung durch das Java-Client beendet erhalten.

Nur so ein Gedanke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top