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

除非提供不同的超时值或心跳,否则实际上默认超时为 60000 毫秒(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 连续馈送实现或 HttpUrlConnection 实现知之甚少。但是,如果您的 java 连接客户端的超时设置低于 couchdb 连续更改的默认心跳,则似乎除非两者的代码中存在任何错误,否则连接可能会被 java 客户端终止。

只是一个想法。

于 2009-11-02T04:18:19.173 回答