JavaからのCouchDB変更通知の継続的な変更はどのように使用しますか?

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

  •  08-07-2019
  •  | 
  •  

質問

私はJavaからcouchdb(継続的)変更APIを使用しようとしていますが、現在の変更のリストを使い果たした後、ストリームは閉じられているように見えます。

使用しているコードは次のとおりです。 whileループから脱落することは決してありませんが、現在の既存の変更のストリーミングが終了したらすぐに行います。私はcouchdbとJavaの両方が比較的新しいので、明らかな何かを見逃しているかもしれません。誰でもこれを正しく書く方法を教えてもらえますか?

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();
役に立ちましたか?

解決

実際には、別のタイムアウト値またはハートビートが提供されない限り、デフォルトのタイムアウトは60000ms(60秒)です。 10月に _changes wikiページを更新し、コードに出会ったデフォルトを含めました。

ハートビートの設定は、基本的にクライアントのタイムアウトを監視することを意味します。つまり、ハートビート期間の改行がないことは、確実に接続が失われたことを意味します。ハートビートがある場合、CouchDBはタイムアウトチェックを無効にします。

いずれにせよ、おそらくある時点で接続が閉じられ、その状態のコードが期待されるはずです。

他のヒント

& heartbeat = 1000 を使用して、couchdbが1秒ごとに回線を介して新しい行を送信できるようにします。これにより、切断するか、CouchDBがシャットダウンするまで、接続が開いたままになります。

しかし、あなたは正しいです、私は接続が閉じないことも期待していました- conn.setReadTimeout(0); も何の助けにもなりません。

これは、couchdbのContinuousFeedの実装やHttpUrlConnectionの実装について十分に知らないため、単なる推測です。ただし、Java接続クライアントのタイムアウトがcouchdbの継続的な変更のデフォルトハートビートよりも低く設定されている場合、Javaクライアントによって接続が終了する可能性があるという2つのコードのバグがないようです。

考えてみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top