我们正在使用HttpURLConnection的API调用REST API到同一服务提供商通常(一种聚合用例的)。我们希望始终向提供者主机开放5个连接池(始终是相同的IP)。如何保持多个Java HttpConnections开到相同的目的地
什么是合适的解决方案?下面是我们的尝试:
System.setProperty("http.maxConnections", 5); // set globally only once
...
// everytime we need a connection, we use the following
HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setUseCaches(true);
...
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
在这一点上,我们读到输入流,直到BufferedReader中返回没有更多的字节。如果我们想要重新使用提供者的底层连接,我们在那之后会做什么?我们的印象是,如果输入流被完全读取,则连接将被添加回池中。
它已经这样工作了好几个星期,但今天它停止工作产生此异常:java.net.SocketException: Too many open files
我们发现在这样CLOSE_WAIT状态无数插槽(通过运行lsof
): java 1814 root 97u IPv6 844702 TCP colinux:58517->123.123.254.205:www (CLOSE_WAIT)
韩元't要么conn.getInputStream()。close()或conn.disconnect()完全关闭连接并将其从池中删除?
谢谢你,你是对的,我们不是一个错误过程中读取错误流。怎么样'stream.close()'和'conn.disconnect()'?他们可以使用还是会打败http保持活着的目的?我在某处写了代码,应该完全读取流,但不能关闭它,但我找不到参考atm。 – Lightbeard 2009-12-21 06:42:47
如果要重新使用连接,则不应关闭流,也不要断开连接。正如我所说的,即使你做的都是正确的,至少在Java 5上仍然会出现套接字泄漏。 – 2009-12-21 14:00:30