gpt4 book ai didi

java - Apache HTTPClient 建立的连接不超过 2 个

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:09 24 4
gpt4 key购买 nike

我一直在尝试使用 Apache HTTPClient (v4.1) 为我的应用程序实现连接池。问题是客户端在运行时总是只建立两个连接,尽管有足够多的线程并行运行。我已经尝试修改代码一段时间了,但还没有任何帮助。
我正在使用 ThreadSafeClientConnManager 进行连接池并将 MaxTotalDefaulMaxPerRoute 设置为我想要的值。
您首先想到的是什么,我可能想检查一下吗?

这是我用来创建客户端的代码段。

DefaultHttpClient createClient() {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(60000));
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(60000));
params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", sf, 6443));
registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, registry);
cm.setMaxTotal(2 * maxConnections);
cm.setDefaultMaxPerRoute(maxConnections);

HttpHost localhost = new HttpHost("localhost");
cm.setMaxForRoute(new HttpRoute(localhost), maxConnections);

HttpHost sdpTargetHost = new HttpHost("webserviceIP", webservicePort, "https");
cm.setMaxForRoute(new HttpRoute(sdpTargetHost, null, true), maxConnections);

return new DefaultHttpClient(cm, params);
}

此函数返回的客户端用于由ThreadPoolExecutor 管理的Runnables。 Runnables 使用客户端,并且有这些行:

HttpResponse response = httpClient.execute(httpPost, context);
HttpEntity entity = response.getEntity();
....
EntityUtils.consume(entity);

据我所知,EntityUtils.consume(entity) 会通知连接管理器该连接不再使用,因此会释放连接以供其他线程使用。所以我猜连接管理没问题。

我想我已经提供了足够的信息,请告诉我是否要添加更多内容。

谢谢

最佳答案

好的。感谢oleg,我找到了解决方案用于指出日志记录、谷歌和所有论坛。
我所要做的就是定义仅包含连接管理器的类,然后使用 HttpClient.setParams() 设置 HttpParams。所以代码看起来像这样:

DefaultHttpClient createClient() {
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", sf, 6443));

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(registry);
cm.setMaxTotal(maxConnections);
cm.setDefaultMaxPerRoute(maxConnections);

HttpHost targetHost = new HttpHost("webserviceIP", webservicePort, "https");
cm.setMaxForRoute(new HttpRoute(targetHost, null, true), maxConnections);

return new DefaultHttpClient(cm);
}

在使用客户端之前,

DefaultHttpClient httpClient = createClient();
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, new Integer(60000));
params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, new Integer(60000));
params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true);
httpClient.setParams(params);

代码逻辑上显然没有区别,但这解决了我的问题。我认为这可能是 HttpClient 4.1 API 中的某种错误。

关于java - Apache HTTPClient 建立的连接不超过 2 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683574/

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