Comment utilisez-vous les modifications continues des notifications de modifications CouchDB à partir de Java?

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

  •  08-07-2019
  •  | 
  •  

Question

J'essaie d'utiliser l'API de modification couchdb (continue) de Java et constate qu'après l'épuisement de la liste des modifications en cours, le flux semble être fermé et ne pas rester ouvert pour toujours comme il est supposé.

Le code que j'utilise est ci-dessous. Je m'attendrais à ne jamais abandonner la boucle while, mais à le faire dès que les modifications existantes sont terminées et diffusées en streaming. Je suis relativement nouveau à la fois sur couchdb et sur java, alors il se peut qu'il manque quelque chose d'évident. Quelqu'un peut-il me montrer comment écrire cela correctement?

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();
Était-ce utile?

La solution

Il existe actuellement un délai d’expiration par défaut de 60000 ms (60 secondes), à moins qu’une valeur de délai d’expiration différente ou une pulsation ne soit fournie. J'ai mis à jour la _changes page de wiki en octobre et inclus les valeurs par défaut que j'ai trouvées dans le code. .

Définir le battement de coeur signifie en principe que vous attendez un délai d’attente du client, c’est-à-dire qu’aucun saut de ligne pour la période de pulsation ne signifie que vous avez définitivement perdu votre connexion. Je crois que CouchDB désactive sa vérification du délai d’attente s’il ya un battement de coeur.

Dans tous les cas, vous devriez probablement vous attendre à ce que la connexion soit fermée à un moment donné et à un code pour cette condition.

Autres conseils

Vous pouvez utiliser & heartbeat = 1000 pour que couchdb envoie de nouvelles lignes sur le fil toutes les secondes. Votre connexion restera ouverte jusqu'à ce que vous vous déconnectiez et / ou que CouchDB soit arrêté.

Mais vous avez raison, je m'attendais également à ce que la connexion ne se ferme pas - cela semble aussi si conn.setReadTimeout (0); ne sert à rien.

Ceci est juste une hypothèse puisque je n'en sais pas assez sur l'implémentation couchdb Continuous Feed ou HttpUrlConnection. Il semble toutefois exclure tout bogue dans le code des deux que, si le délai d’attente défini pour votre client de connexion java soit inférieur au battement de cœur par défaut pour les modifications continues de couchdb, le client java pourrait alors mettre fin à la connexion.

Juste une pensée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top