Apache HttpAsyncClient 如何设置per request timeout
最近做一个项目时用到HttpAsyncClient;因项目所需,要求能对一个具体的request 设置连接和读写超时;但发现在HttpAsyncClient中,只有在创建一个HttpAsyncClient实例时才能通过RequestConfig设置一个timeout,除此之外并没有一个接口可以设置单个请求的超时。为了达到项目的要求,只有从把HttpAsyncClient的源码大致读了一遍,一是希望能从源码中找到设置超时的方法,二是希望,如果确实没有办法,能仿照源码写一个可控制超时的HttpAsyncClient实现。
通过对HttpAsyncClient源码的分析发现,在执行一个HttpRequest时,HttpAsyncClient会调用HttpAsyncClientExchangeHandler来完成请求的处理,缺省的HttpAsyncClientExchangeHandler实现中,它的requestConnection函数里会从一个HttpClientContext获取一个RequestConfig,从获取的RequestConfig中它将取出所设置的超时值并加以使用。
在缺省HttpAsyncClient实现中,HttpClientContext要么可从HttpAsyncClient.execute传入的HttpContext参数创建,要么则会临时生成一个缺省的BasicContext。HttpContext本身并没有提供对RequestConfig的设置或修改,但HttpClientContext则可以允许设置或修改RequestConfig。有了这个发现,则可以通过如下的workaround来满足我们的需求(之所以说是workaround,因为我总觉得这个做法并不是最自然的做法,或许有更好更直观的做法来满足需求?)
private HttpClientContext _getContext(int connectTimeoutInSec, int socketTimeoutInSec) {
HttpClientContext ctx = new HttpClientContext();
/**
* 从缺省的requestConfig中copy一个requestConfig出来以便修改
*/
RequestConfig config = RequestConfig.copy(_requestConfig).setConnectTimeout(
connectTimeoutInSec <= 0 ? _DEFAULT_CONNECT_TIMEOUT * 1000 : connectTimeoutInSec * 1000
).setSocketTimeout(
socketTimeoutInSec <= 0 ? _DEFAULT_READ_TIMEOUT * 1000 : socketTimeoutInSec * 1000
).build();
ctx.setRequestConfig(config);
return ctx;
}
有了上述代码,那我们自然而然的就可以在做post/get请求时加入我们所需的超时设置了:
public void get(HttpGet req, Callback<HttpResponse> callback, int connectTimeoutInSec, int socketTimeoutInSec) {
_httpClient.execute(req, _getContext(connectTimeoutInSec, socketTimeoutInSec), new CallbackAdaptor<HttpResponse>(callback));
}
public void post(HttpPost req, Callback<HttpResponse> callback, int connectTimeoutInSec, int socketTimeoutInSec) {
_httpClient.execute(req, _getContext(connectTimeoutInSec, socketTimeoutInSec), new CallbackAdaptor<HttpResponse>(callback));
}
Apache HttpAsyncClient 如何设置per request timeout的更多相关文章
- 在Apache Tomcat 7设置redis作为session store
在Apache Tomcat 7设置redis作为session store //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...
- 记一次 XxlRpcException:xxl-rpc request timeout at 超时问题
事件起因 昨天有同事找我到,说他搭建的 XXL-JOB 任务调度系统不能工作了,调用总是出错(服务端返回 500)希望我能帮忙处理一下,不过说实话我也没有搭建过 XXL-JOB 的经验,但是既然同事请 ...
- golang micro client 报错500 {"id":"go.micro.client","code":408,"detail":"call timeout: context deadline exceeded","status":"Request Timeout"}
go micro web端连接services时,第一次访问提示500(broken pipe),排查发现客户端请求services时返回 {"id":"go.micro ...
- [Windows Server 2008] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...
- [Windows Server 2012] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- apache环境.htaccess设置301跳转及常用.htaccess技巧整理
apache环境.htaccess设置301跳转及常用.htaccess技巧整理 无论是Nginx,还是Apache都各自有优势,对于我们普通用户而言基本上也没有多大的区别.在虚拟主机环境中,基本上都 ...
- Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)
Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...
- httpclient发送request请求时设置header和timeout
package com.xxx.xxx.common; import java.io.BufferedReader; import java.io.InputStreamReader; import ...
- apache服务器参数设置
全局参数设置 ServerRoot:服务器根目录 apache安装目录[我的为:/usr/local/apache/] 用于指定apache服务器的配置文件及日志文件存放的根目录.服务器的基础目录,a ...
随机推荐
- css 字间距、CSS字体间距、css 字符间距设置
1.text-indent设置抬头距离css缩进 2.letter-spacing来设置字与字间距_字符间距离,字体间距css样式
- three.js 根据png生成heightmap
Three.js: render real world terrain from heightmap using open data By jos.dirksen on Tue, 07/17/2012 ...
- 十大开源的.NET用户界面框架 让GUI设计不再犯难
选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题,因为用户界面相当于一款应用的"门面",直接面向用户.好的UI更能吸引用户,有时甚至成为决定一款应用成败的关键.下面 ...
- [python] os.path说明
os.path - Common pathname manipulations操作 This module implements some useful functions on pathnames. ...
- jQuery的ajax问题
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...
- RHEL7学习之NTP配置
一,安装NTP [root@localhost ~]# yum install ntp Loaded plugins: product-id, subscription-manager This sy ...
- Http协议与TCP协议简单理解(转)
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- eclipse中java项目的build path详解
BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ...
- maven SpringMVC easyUI项目创建
在Eclipse中使用Maven创建SpringMVC项目,项目所需软件及工具可以在官网下载.Maven.Nexus及Eclipse集成Maven等到此配置完毕. 1.Maven创建Web项目. 打开 ...
- C++Builder设置完BorderStyle的值为none,以后如何实现窗口的移动和拉伸
在.h 文件中声明变量private: void __fastcall WndProc(TMessage &Msg);// User declarations: 在.cpp中实现下面的函数 v ...