1.概述

本教程将展示如何使用Apache配置超时HttpClient 4

如果你想更深入地研究并学习其他可以用HttpClient做的很酷的事情,请转到主要的HttpClient教程

进一步阅读:

HttpClient连接管理

如何与Apache HttpClient 4打开,管理和关闭连接。

httpclient 4 - 跟随帖子的重定向

如何使用Apache HttpClient启用帖子重定向。

高级HTTPClient配置

高级用例的HttpClient配置。

2.在之前配置超时HttpClient4.3

2.1。生字符串参数

在4.3版发布之前HttpClient附带了许多配置参数,所有这些都可以以一种通用的、类似于地图的方式设置。

3需要配置的超时参数:

DefaultHttpClient httpClient = new DefaultHttpClient();int timeout = 5;//秒HttpParams HttpParams = httpClient.getParams();httpparams.setParameter(CoreconnectionPnames.Connection_Timeout,超时* 1000);httpparams.setParameter(CoreconnectionPnames.so_timeout,超时* 1000);httpparams.setParameter(ClientPnames.conn_manager_timeout,new long(超时* 1000));

2.2。API

这些参数中更重要的——即前两个——也可以通过更类型安全的API设置:

DefaultHttpClient httpClient = new DefaultHttpClient();int timeout = 5;//秒HttpParams HttpParams = httpClient.getParams();HttpConnectionParams。setConnectionTimeout(httpParams, timeout * 1000);/ / http.connection.timeout HttpConnectionParams。setSoTimeout(httpParams, timeout * 1000);/ / http.socket.timeout

第三个参数没有自定义setterHttpConnectionParams,它仍然需要通过。手动设置setParameter方法。

3.使用新的4.3配置超时。建造者

4.3中推出的流利的建设者API提供在高级设置超时的正确方法:

int timeout = 5;RequestConfig config = RequestConfig.custom() .setConnectTimeout(timeout * 1000) .setConnectionRequestTimeout(timeout * 1000).build();CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();

这是以类型安全且可读的方式配置所有三个超时的推荐方法。

4.超时属性解释

现在,让我们解释各种类型的超时意味着什么:

  • 连接超时(http.connection.timeout)—与远程主机建立连接的时间
  • 套接字超时(http.socket.timeout) - 在建立连接后等待数据的时间;两个数据包之间的最大不活动时间
  • 连接管理器超时(http.connection-manager.Timeout.) - 从Connection Manager /池等待连接的时间

前两个参数 - 连接和套接字超时 - 是最重要的。但是,在高负载方案中设置获取连接的超时肯定是重要的,这就是为什么不忽视第三个参数的原因。

5.使用HttpClient

配置后,我们现在可以使用客户端执行HTTP请求:

httpget getmethod = new httpget(“http:// host:8080 / path”);HttpResponse response = httpClient.execute(getMethod);system.out.println(“响应的http状态:”+ responst.getstatusline()。getstatuscode());

对于前面定义的客户机,与主机的连接将在5秒内超时。另外,如果连接已经建立,但没有接收到数据,也会超时另外5秒

请注意,连接超时将导致一个org.apache.http.conn.ConnectTimeoutException被抛出,而套接字超时将导致ajava.net.SocketTimeoutException

6.硬超时

在建立HTTP连接而不是接收数据时设置超时非常有用,有时我们需要设置一个整个请求的硬超时

例如,下载潜在的大文件适合此类别。在这种情况下,可以成功建立连接,可以始终如一地通过,但是我们仍然需要确保操作不会超过一些特定的时间阈值。

HttpClient没有任何配置允许我们设置一个请求的整体超时;然而,它确实提供了请求中止功能,所以我们可以利用该机制来实现一个简单的超时机制:

getMethod = new HttpGet("http://localhost:8080/httpclient-simple/api/bars/1");int hardTimeout = 5;//秒TimerTask task = new TimerTask() {@Override public void run() {if (getMethod != null) {getMethod.abort();}}};新计时器(true)。schedule(task, hardTimeout * 1000);HttpResponse response = httpClient.execute(getMethod);system.out.println(“响应的http状态:”+ responst.getstatusline()。getstatuscode());

我们利用java.util.Timerjava.util.TimerTask建立一个简单的延迟任务,中止HTTP GET请求经过5秒钟的硬超时。

7.超时和DNS轮询-需要注意的东西

这是相当普遍的,一些较大的域将使用DNS轮询配置-本质上有同一个域映射到多个IP地址。这引入了一个针对这样一个域的超时的新挑战,因为HttpClient将尝试连接到超时的域:

  • HttpClient得到IP路由列表这个域
  • 它尝试第一个-超时(我们配置的超时)
  • 它尝试第二个-也会超时
  • 等等 …

所以,你可以看到当我们期望的时候,整体操作不会超时。相反 - 当所有可能的路线都超时时,它会超时。更重要的是 - 这将完全透明地为客户端(除非您在调试级别配置日志)。

这里有一个简单的例子,你可以运行和复制这个问题:

int超时= 3;RequestConfig Config = RequestConfig.Custom()。setConnectTimeout(超时* 1000)。setConnectionRequestTimeout(超时* 1000)。SetsocketTimeout(超时* 1000).build();closeablehttpclient client = httpclientbuilder.create().setdefaultrequestconfig(config).build();httpget请求= new httpget(“http://www.google.com:81”);response = client.execute(请求);

您将注意到使用调试日志级别的重试逻辑:

DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connect to www.google.com/173.194.34.212:81 DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connect to www.google.com/173.194.34.212:81超时。调试oa.h.i.c.httpclientconnectionoperator -连接到www.google.com/173.194.34.208:81 DEBUG o.a.h.i.c.HttpClientConnectionOperator -连接到www.google.com/173.194.34.208:81超时。调试oa.h.i.c.httpclientconnectionoperator -连接到www.google.com/173.194.34.209:81 DEBUG o.a.h.i.c.HttpClientConnectionOperator -连接到www.google.com/173.194.34.209:81超时。连接将使用另一个IP地址重试//…

8.结论

本教程讨论了如何配置各种类型的超时可用HttpClient。它还说明了一种简单的机制,用于持续的HTTP连接的硬超时。

这些例子的实现可以在GitHub项目

通用的底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
8注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!