Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java connectionmanager真的应该关闭吗?_Java_Sockets_Connection Pooling_Apache Httpclient 4.x - Fatal编程技术网

Java connectionmanager真的应该关闭吗?

Java connectionmanager真的应该关闭吗?,java,sockets,connection-pooling,apache-httpclient-4.x,Java,Sockets,Connection Pooling,Apache Httpclient 4.x,有时我会收到 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.im

有时我会收到

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) 
我看到了类似的问题,我也使用了apache的httpclient,但答案似乎对我没有多大帮助

有两个答案:

1) 执行
httpClient.getConnectionManager().shutdown()

2) 调用
entity.getContent().close()
而不是
entity.consumercontent()

但似乎没有一个是合适的

1) 问题是我使用的是
ThreadSafeConnectionManager
。它只创建一次(在应用程序启动时)。因此,我们不需要关闭(以便连接可以重用)。如果我关闭此管理器-所有连接都将关闭。如果我使用
SingleClientConnectionManager
,这将是合适的,但我不这样做。我说得对吗

2) 我发现我也没有关闭小溪。但是当我开始调试时,这个
getContent()
流似乎已经关闭了,甚至在调用
consumercontent()
之前。尽管(即使在
consumeContent
之后)这些getContent()流中的
socketInputStream
和套接字都没有关闭。坏吗?这可能是问题的原因吗?我还没找到关闭这个插座的方法!它位于外部输入流的内部,所以我无法获取它。但是我看到在调试模式下,这个套接字没有关闭,以及
SocketInputStream

我们应该如何正常使用
ThreadSafeConnectionManager
——它应该只创建一次吗?如果是这样,如何正确关闭这些插座(如果有的话)

如果我关闭此管理器-所有连接都将关闭。 如果我使用SingleClientConnectionManager是合适的,但是我 不要。我说得对吗

每个不同的HTTP服务应该只使用一个连接管理器实例。您实际上不需要关闭它,但您可能希望从空闲时间超过给定时间段的池中退出连接,如下所述:

虽然(即使在消费内容之后)socketInputStream在 那些getContent()流以及套接字未关闭。它是 糟糕

不,不是。如果基础连接处于一致状态,则它可能仍保持活动状态。但是,必须关闭内容流,以确保将该连接释放回连接管理器

我们应该如何正常使用ThreadSafeConnectionManager- 它应该只创建一次吗?如果是这样,如何正确关闭 那些插座,如果有的话

是的,它只能创建一次。但是,您必须确保通过关闭响应内容流将连接正确释放回管理器。您可能还希望在一段时间不活动后主动从池中逐出连接


最后,请注意,应用程序的其他组件也可能泄漏文件描述符。罪魁祸首不一定是HttpClient的连接管理器。

例如,哪些其他组件可能泄漏文件描述符?谢谢你的回答。只要打开文件或套接字就可以了。