【发布时间】:2011-12-13 13:55:58
【问题描述】:
有时我会收到
java.net.SocketException: Too many open files
java.net.Socket.createImpl(Socket.java:397)
java.net.Socket.connect(Socket.java:527)
org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123)
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147)
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:597)
我看到了类似的问题java.net.SocketException: Too many open files,我也使用了apache的httpclient,但似乎答案对我没有太大帮助......
有两个答案:
1) 做httpClient.getConnectionManager().shutdown();
2) 调用entity.getContent().close() 而不是entity.consumeContent()
但似乎没有一个适合...
1) 问题是我使用的是ThreadSafeConnectionManager。它被创建一次(在应用程序启动时)。因此我们不会关闭(以便连接可重用)。如果我在此管理器上关闭 - 所有连接都将关闭。如果我使用SingleClientConnectionManager 是合适的,但我没有。我说的对吗?
2) 我发现我也没有关闭流。但是当我开始调试时 - 似乎这个getContent() 流已经关闭,甚至在调用consumeContent() 之前。尽管(即使在consumeContent 之后)那些 getContent() 流中的socketInputStream 以及套接字都没有关闭。不好吗?这可能是问题的原因吗?而且我没有找到关闭此套接字的方法!它位于外部输入流内部,所以我无法得到它。但是我在调试模式下看到这个socket没有关闭,还有SocketInputStream。
我们应该如何正常使用ThreadSafeConnectionManager - 它应该只创建一次吗?如果是这样,如果有的话,如何正确关闭这些套接字?
【问题讨论】:
标签: java sockets connection-pooling apache-httpclient-4.x