Come si utilizzano CouchDB Notifiche di modifica modifiche continue da Java?

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

  •  08-07-2019
  •  | 
  •  

Domanda

Sto provando a utilizzare l'API delle modifiche couchdb (continue) da Java e trovo che dopo aver esaurito l'elenco delle modifiche correnti il ??flusso sembra essere chiuso, non rimanere aperto per sempre come dovrebbe.

Il codice che sto usando è sotto. Mi aspetterei di non abbandonare mai il ciclo while, ma lo farei non appena le modifiche attualmente esistenti saranno terminate in streaming. Sono relativamente nuovo sia a couchdb che a Java, quindi potrebbe mancare qualcosa di ovvio. Qualcuno può mostrarmi come scrivere questo 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();
È stato utile?

Soluzione

In realtà esiste un timeout predefinito di 60000ms (60 secondi) a meno che non venga fornito un valore di timeout diverso o un battito cardiaco. Ho aggiornato la _changes wiki page nel mese di ottobre e ho incluso tutti i valori predefiniti che ho riscontrato nel codice .

L'impostazione del battito cardiaco significa sostanzialmente che starai guardando per un timeout nel client, vale a dire che nessuna nuova linea per il periodo del battito cardiaco significa che hai definitivamente perso la connessione. Credo che CouchDB disabiliti il ??controllo del timeout se c'è un battito cardiaco.

In ogni caso, probabilmente dovresti aspettarti che la connessione venga chiusa ad un certo punto e codice per quella condizione.

Altri suggerimenti

Puoi usare & amp; heartbeat = 1000 per fare in modo che couchdb invii nuove linee sul filo ogni secondo. Ciò manterrà la tua 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 che anche conn.setReadTimeout (0); non aiuta nulla.

Questa è solo una supposizione poiché non conosco abbastanza sull'implementazione difeedfeed continued o sull'implementazione di HttpUrlConnection. Ma sembra escludere eventuali bug nel codice dei due che se il client di connessione java ha un timeout impostato inferiore al battito cardiaco predefinito per le modifiche continue di couchdb, la connessione potrebbe essere terminata dal client java.

Solo un pensiero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top