HttpClient Timeout
1. Overview
This tutorial will show how to configure a timeout with the Apache HttpClient 4.
If you want to dig deeper and learn other cool things you can do with the HttpClient – head on over to the main HttpClient tutorial.
2. Configure Timeouts via raw String Parameters
The HttpClient comes with a lot of configuration parameters – and all of these can be set in a generic, map-like manner.
There are 3 timeout parameters to configure:
|
1
2
3
4
5
6
7
8
9
10
|
DefaultHttpClient httpClient = new DefaultHttpClient();int timeout = 5; // secondsHttpParams httpParams = httpClient.getParams();httpParams.setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);httpParams.setParameter( CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);// httpParams.setParameter(// ClientPNames.CONN_MANAGER_TIMEOUT, new Long(timeout * 1000)); |
A quick note is that the last parameter – the connection manager timeout – is commented out when using the 4.3.0 or 4.3.1 versions, because of this JIRA (due in 4.3.2).
3. Configure Timeouts via the API
The more important of these parameters – namely the first two – can also be set via a more type safe API:
|
1
2
3
4
5
6
7
8
|
DefaultHttpClient httpClient = new DefaultHttpClient();int timeout = 5; // secondsHttpParams httpParams = httpClient.getParams();HttpConnectionParams.setConnectionTimeout( httpParams, timeout * 1000); // http.connection.timeoutHttpConnectionParams.setSoTimeout( httpParams, timeout * 1000); // http.socket.timeout |
The third parameter doesn’t have a custom setter in HttpConnectionParams, and it will still need to be set manually via the setParameter method.
4. Configure Timeouts using the new 4.3. Builder
The fluent, builder API introduced in 4.3 provides the right way to set timeouts at a high level:
|
1
2
3
4
5
6
7
|
int timeout = 5;RequestConfig config = RequestConfig.custom() .setConnectTimeout(timeout * 1000) .setConnectionRequestTimeout(timeout * 1000) .setSocketTimeout(timeout * 1000).build();CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); |
That is the recommended way of configuring all three timeouts in a type-safe and readable manner.
5. Timeout Properties Explained
Now, let’s explain what these various types of timeouts mean:
- the Connection Timeout (http.connection.timeout) – the time to establish the connection with the remote host
- the Socket Timeout (http.socket.timeout) – the time waiting for data – after the connection was established; maximum time of inactivity between two data packets
- the Connection Manager Timeout (http.connection-manager.timeout) – the time to wait for a connection from the connection manager/pool
The first two parameters – the connection and socket timeouts – are the most important, but setting a timeout for obtaining a connection is definitely important in high load scenarios, which is why the third parameter shouldn’t be ignored.
6. Using the HttpClient
After being configured, the client can not be used to perform HTTP requests:
|
1
2
3
4
|
HttpResponse response = httpClient.execute(getMethod);System.out.println( "HTTP Status of response: " + response.getStatusLine().getStatusCode()); |
With the previously defined client, the connection to the host will time out in 5 seconds, and if the connection is established but no data is received, the timeout will also be 5 additional seconds.
Note that the connection timeout will result in an org.apache.http.conn.ConnectTimeoutException being thrown, while socket timeout will result in a java.net.SocketTimeoutException.
7. Hard Timeout
While setting timeouts on establishing the HTTP connection and not receiving data is very useful, sometimes we need to set a hard timeout for the entire request.
For example, the download of a potentially large file fits into this category – in this case, the connection may be successfully established, data may be consistently coming through, but we still need to ensure that the operation doesn’t go over some specific time threshold.
HttpClient doesn’t have any configuration that allows us to set an overall timeout for a request; it does, however, provide abort functionality for requests, so we can leverage that mechanism to implement a simple timeout mechanism:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
HttpGet getMethod = new HttpGet(int hardTimeout = 5; // secondsTimerTask task = new TimerTask() { @Override public void run() { if (getMethod != null) { getMethod.abort(); } }};new Timer(true).schedule(task, hardTimeout * 1000);HttpResponse response = httpClient.execute(getMethod);System.out.println( "HTTP Status of response: " + response.getStatusLine().getStatusCode()); |
We’re making use of the java.util.Timer and java.util.TimerTask to set up a simple delayed task which aborts the HTTP GET request after a 5 seconds hard timeout.
8. Timeout and DNS Round Robin – something to be aware of
It is quite common that some larger domains will be using a DNS round robin configuration – essentially having the same domain mapped to multiple IP addresses. This introduces a new challenge for a timeout against such a domain, simply because of the way HttpClient will try to connect to that domain that times out:
- HttpClient gets the list of IP routes to that domain
- it tries the first one – that times out (with the timeouts we configure)
- it tries the second one – that also times out
- and so on …
So, as you can see – the overall operation will not time out when we expect it to. Instead – it will time out when all the possible routes have timed out, and what it more – this will happen completely transparently for the client (unless you have your log configured at the DEBUG level). Here is a simple example you can run and replicate this issue:
|
1
2
3
4
5
6
7
8
9
10
|
int timeout = 3;RequestConfig config = RequestConfig.custom(). setConnectTimeout(timeout * 1000). setConnectionRequestTimeout(timeout * 1000). setSocketTimeout(timeout * 1000).build();CloseableHttpClient client = HttpClientBuilder.create() .setDefaultRequestConfig(config).build();response = client.execute(request); |
You will notice the retrying logic with a DEBUG log level:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connecting to www.google.com/173.194.34.212:81DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connect to www.google.com/173.194.34.212:81 timed out. Connection will be retried using another IP addressDEBUG o.a.h.i.c.HttpClientConnectionOperator - Connecting to www.google.com/173.194.34.208:81DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connect to www.google.com/173.194.34.208:81 timed out. Connection will be retried using another IP addressDEBUG o.a.h.i.c.HttpClientConnectionOperator - Connecting to www.google.com/173.194.34.209:81DEBUG o.a.h.i.c.HttpClientConnectionOperator - Connect to www.google.com/173.194.34.209:81 timed out. Connection will be retried using another IP address//... |
9. Conclusion
This tutorial discussed how to configure the various types of timeouts available for an HttpClient. It also illustrated a simple mechanism for hard timeout of an ongoing HTTP connection.
The implementation of these examples can be found in the GitHub project – this is a Maven-based project, so it should be easy to import and run as it is.
HttpClient Timeout的更多相关文章
- HttpClient Timeout waiting for connection from pool 问题解决方案
错误:org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 前言 ...
- HttpClient throws TaskCanceledException on timeout
error msg: HttpClient throws TaskCanceledException on timeout HttpClient is throwing a TaskCanceledE ...
- TIMEOUT HANDLING WITH HTTPCLIENT
https://www.thomaslevesque.com/2018/02/25/better-timeout-handling-with-httpclient/ The problem If yo ...
- HttpClient 使用
Api支持 HttpClient 是基于Task的异步方法组,支持取消.超时异步特性,其可以分类为以下: Restful: GetAsync,PostAsync,DeleteAsync,PutAsyn ...
- android 请求网络 和 httpclient的使用上传下载
访问网络最主要的也就是 http协议了. http协议很简单,但是很重要. 直接上代码了,里面都是1个代码块 代码块的,用哪一部分直接拷出去用就好了. 1.访问网络用 get 和 post 自己组拼 ...
- C# httpclient获取cookies实现模拟web登录
目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能. 在二期开发中,产 ...
- Asp.Net Core 轻松学-HttpClient的演进和避坑
前言 在 Asp.Net Core 1.0 时代,由于设计上的问题, HttpClient 给开发者带来了无尽的困扰,用 Asp.Net Core 开发团队的话来说就是:我们注意到,HttpC ...
- C# .net 中 Timeout 的处理及遇到的问题
C# 中 Timeout 的处理 前言 最近在项目中要实现一个功能,是关于 Timeout 的,主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间,在这两个时间层面上,如果超出了设置的时间 ...
- .net core 中使用httpclient,HttpClientFactory的问题
Microsoft 在.Net Framework 4.5中引入了HttpClient,并且是在.NET服务器端代码中使用Web API的最常用方法.但它有一些严重的问题,如释放HttpClient对 ...
随机推荐
- Web验证方式(1)--Http Basic Authentication
Http Basic Authentication是HTTP协议中定义的Web系统中的验证方式.参考wiki 主要的实现机制如下: 1. 用户通过浏览器匿名访问web资源. 2. web服务器检测到w ...
- Oracle本地网络服务名配置
1.安装Oracle 11G Client后可以在开始菜单中找到 选择NETCA->本地网络服务名配置 选择添加本地网服务名配置 这里的服务名:指的是也就是数据库名 在网络中架设C/S 客户端选 ...
- nginx收到空包问题
tcpdump有收包,但是nginx的access.log显示post数据为空 可以通过tcpdump监控端口 http://www.cnblogs.com/linn/p/4792468.html 修 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
- Git----远程仓库之添加远程库02
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub上创建一个Git库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- open中的mode
[open中的mode] 当使用O_CREAT标志的open来创建文件时,我们必须使用三个参数格式的open调用.第三个参数mode 是几个标志按位OR后得到的.他们是: S_IRUSR: 读权限,文 ...
- MyEclipse10.0 配置 Tomcat1.7
1 首先 从网上下载Tomcat1.7,然后放到本机目录. 2 然后在MyEclipse10.0菜单Preferences 指向Tomcat的路径,我本机路径是 D:\Program Files (x ...
- 第七章 二叉搜索树 07B2-1 插入:算法
- 07-SSH综合案例:前台用户模块:结构创建及注册页面跳转
现在就不要直接访问一个JSP,要通过一个Action映射过去.我现在点击要去一个注册的页面 这还不是一个真正的注册,只是一个页面的跳转. 1.5.2 用户模块 注册功能: 在index.jsp页面中点 ...
- spring boot 2
服务端验证: // 1.修改实体 @Min(value = 18,message = "必须大于18岁") private int age; // 2.修改add方法 @PostM ...