gpt4 book ai didi

java - 如何确保我的 HttpClient 4.1 不泄漏套接字?

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:54 26 4
gpt4 key购买 nike

我的服务器基于每个请求使用来自内部网络服务的数据来构建其响应。我正在使用 Apache HttpClient 4.1 发出请求。每个初始请求将导致对 Web 服务的大约 30 个请求。其中,4 - 8 个套接字最终会卡在 CLOSE_WAIT 中,永远不会被释放。最终,这些卡住的套接字超过了我的 ulimit,我的进程用完了文件描述符。

我不想只提高我的 ulimit (1024),因为那只会掩盖问题。

我转向 HttpClient 的原因是 java.net.HttpUrlConnection 的行为方式相同。

我已尝试根据请求移动到 SingleClientConnManager,并在其上调用 client.getConnectionManager().shutdown(),但套接字最终仍然卡住。

我应该尝试解决这个问题,以便在没有正在运行的请求时以 0 个打开的套接字结束,还是应该专注于请求持久性和池化?

为了清楚起见,我包括了一些可能相关的细节:

操作系统:Ubuntu 10.10

JRE:1.6.0_22

语言:Scala 2.8

示例代码:

val cleaner = Executors.newScheduledThreadPool(1) 
private val client = {
val ssl_ctx = SSLContext.getInstance("TLS")
val managers = Array[TrustManager](TrustingTrustManager)
ssl_ctx.init(null, managers, new java.security.SecureRandom())
val sslSf = new org.apache.http.conn.ssl.SSLSocketFactory(ssl_ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
val schemeRegistry = new SchemeRegistry()
schemeRegistry.register(new Scheme("https", 443, sslSf))
val connection = new ThreadSafeClientConnManager(schemeRegistry)
object clean extends Runnable{
override def run = {
connection.closeExpiredConnections
connection.closeIdleConnections(30, SECONDS)
}
}
cleaner.scheduleAtFixedRate(clean,10,10,SECONDS)
val httpClient = new DefaultHttpClient(connection)
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY), new UsernamePasswordCredentials(username,password))
httpClient
}
val get = new HttpGet(uri)
val entity = client.execute(get).getEntity
val stream = entity.getContent
val justForTheExample = IOUtils.toString(stream)
stream.close()

测试:netstat -a | grep {myInternalWebServiceName} | grep CLOSE_WAIT

(列出我的进程处于 CLOSE_WAIT 状态的套接字)

发表评论讨论:

这段代码现在演示了正确的用法。

最佳答案

需要主动从连接池中逐出过期/空闲连接,因为在阻塞 I/O 模型中,连接无法对 I/O 事件使用react,除非它们正在被读取/写入至。详情见

http://hc.apache.org/httpcomponents-client-dev/tutorial/html/connmgmt.html#d4e631

关于java - 如何确保我的 HttpClient 4.1 不泄漏套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724193/

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