您如何使用CouchDB更改通知从Java进行持续更改?

时间:2009-10-28 22:51:56

标签: couchdb

我正在尝试使用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();

3 个答案:

答案 0 :(得分:7)

除非提供不同的超时值或心跳,否则实际默认超时为60000毫秒(60秒)。我在十月份更新了_changes wiki page,其中包含了我在代码中遇到的所有默认值。

设置心跳基本上意味着您将在客户端观察超时,即心跳周期没有换行意味着您确实丢失了连接。我相信如果有心跳,CouchDB会禁用其超时检查。

在任何情况下,您都应该期望在某个时刻关闭连接并为该条件编写代码。

答案 1 :(得分:4)

您可以使用&heartbeat=1000让couchdb每秒通过线路发送新线路。这将使您的连接保持打开状态,直到断开连接和/或CouchDB关闭为止。

但你是对的,我也希望连接不会关闭 - 似乎conn.setReadTimeout(0);也没有任何帮助。

答案 2 :(得分:0)

这只是一个猜测,因为我不太了解couchdb continuousfeed实现或HttpUrlConnection实现。但似乎禁止二者代码中的任何错误,如果你的java连接客户端的超时设置低于couchdb连续更改的默认心跳,那么连接可能会被java客户端终止。

只是一个想法。