加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 应该connectmanager真的关机吗?

发布时间:2020-12-15 08:46:10 所属栏目:Java 来源:网络整理
导读:有时我会收到 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.a
有时我会收到

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 – 它应该只创建一次吗?如果是这样,如何正确关闭这些插座?

解决方法

If I do shutdown on this manager – all the connection will be closed.
It would be appropriate if I use SingleClientConnectionManager,but I
don’t. Am I right?

您应该每个不同的HTTP服务只使用一个连接管理器实例.您实际上并不需要将其关闭,但是您可能想要从池中驱逐已经闲置超过给定时间段的连接,如下所述:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e659

Although (even after consumeContent) the socketInputStream inside
those getContent() stream was not closed,as well as socket. Is it
bad?

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

How normally we should work with a ThreadSafeConnectionManager –
should it be created only once? and if it is so,how to properly close
those sockets if any?

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读