gpt4 book ai didi

java - connectionmanager 真的应该关闭吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:30 26 4
gpt4 key购买 nike

有时我会收到

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 没有关闭,套接字也是如此。不好吗?这可能是问题的原因吗?而且我没有找到关闭此套接字的方法!它位于外部输入流的内部,所以我看不到它。但是我在调​​试模式下看到,这个套接字以及 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?

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

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 的连接管理器。

关于java - connectionmanager 真的应该关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com