首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache HttpComponents BasicHttpClientConnectionManager

Apache HttpComponents BasicHttpClientConnectionManager
EN

Stack Overflow用户
提问于 2016-08-25 08:09:01
回答 1查看 2.1K关注 0票数 1

我最近从java.net切换到了org.apache.http.client,我用HttpClientBuilder安装了一个ClosableHttpClient。作为连接管理器,我正在使用BasicHttpClientConnectionManager

现在,我遇到的问题是,当我创建一些HTTP请求时,经常会出现超时异常。连接管理器似乎打开连接以重用它们,但是如果系统空闲了几分钟,那么这个连接就会超时,当我提出下一个请求时,首先得到的是超时。再重复一次同样的请求,通常不会有任何问题。

是否有一种方法来配置BasicHttpClientConnectionManager以避免重用其连接并每次创建一个新连接?

EN

回答 1

Stack Overflow用户

发布于 2016-08-27 09:31:05

有几种处理这个问题的方法

  1. 将不再需要的空闲连接排除在外。下面的代码通过关闭每个httpclient =新的HttpClients.custom().setConnectionManager(cm).build();()之后的持久连接来有效地禁用连接持久性;CloseableHttpClient httpclient= exchange.BasicHttpClientConnectionManager .尝试(CloseableHttpResponse response = httpclient.execute(new HttpGet(“/”)){ System.out.println(response.getStatusLine());EntityUtils.consume(response.getEntity());} cm.closeIdleConnections(0,TimeUnit.MILLISECONDS);
  2. 将连接限制在相对较小的东西上,使其保持存活时间。 BasicHttpClientConnectionManager cm =新BasicHttpClientConnectionManager();CloseableHttpClient httpclient = HttpClients.custom() .setConnectionManager(cm) .setKeepAliveStrategy((响应,上下文) -> 1000) .build();尝试(CloseableHttpResponse response =httpclient.execute(新HttpGet(“/”){System.out.println(response.getStatusLine();EntityUtils.consume(response.getEntity())};
  3. (推荐)使用池连接管理器,并将连接总时间设置为有限值。与池连接管理器相比,使用基本连接管理器没有好处,除非您的代码被期望在EJB容器中运行。 CloseableHttpClient httpclient = HttpClients.custom() .setConnectionTimeToLive(5,TimeUnit.SECONDS) .build();.build (CloseableHttpResponse response =httpclient.execute(新HttpGet(“/”){ System.out.println(response.getStatusLine());EntityUtils.consume(response.getEntity());}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39139902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档