7

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

3 に答える 3

7

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

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

いずれにせよ、おそらく、ある時点で接続が閉じられ、その状態のコードが作成されることを期待する必要があります。

于 2009-11-26T12:45:06.783 に答える
4

を使用&heartbeat=1000して、couchdb がネットワーク上で毎秒新しい行を送信するようにすることができます。これにより、切断するか CouchDB がシャットダウンされるまで、接続が開かれたままになります。

しかし、あなたは正しいです、私は接続が閉じないことも期待していました-それもconn.setReadTimeout(0);何の役にも立たないようです.

于 2009-11-26T11:25:04.077 に答える
0

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

ちょっとした考え。

于 2009-11-02T04:18:19.173 に答える