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 ...
随机推荐
- NMAP 基本用法
Nmap 用途: 1.通过对设备或者防火墙的探测来审计它的安全性. 2.探测目标主机所开放的端口. 3.网络存储,网络映射,维护和资产管理.(这个有待深入) 4.通过识别新的服务器审计网络的安全性. ...
- 有效提高win7电脑网速50倍
有效提高win7电脑网速50倍 目前有多少人在使用Windows7?据统计微软已成功售出3.5亿份正版操作系统,加上市场上流传以Win7旗舰版为首的盗版Win7系统下载,Win7激活次数可能已经超过1 ...
- ajax 如何提交数据到后台jsp页面,以及提交完跳转到jsp页面
我logincheck.jsp页面取传参数代码: String user=request.getParameter("user1"); String pwd=request.get ...
- python操作系统环境变量
获取整个系统变量的方法是os.environ,这是一个os的class类型,使用的时候可以转换为字典类型 environ_value = dict(os.environ) 这样就可以看所有的key,e ...
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系
转自http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称 ...
- aix 维护常用命令
errpt - dH :如果有记录表示硬故障件出现.#向ibm报修 mail:关键错误信息会以mail方式发给root用户.#根据报错程序联系相应厂家. df -g: 文件系统不可以,当/va ...
- [学习笔记]坚果云网盘,SVN异地代码管理
SVN的好处不必多说了.但是如果希望有一份自己的用来学习和储备的代码仓库,那么能够异地同步是必不可少的了. 参考作者Mike_QSJ的文章,但是实际上做了很大的改动.一方面使用更常见的windows系 ...
- orale 函数大全[转]
oracle函数大全 http://wenku.baidu.com/link?url=bXaGsnn8iN264GB8ec48IUPg5eRGDKAyAiSw0OBKL1I0mBVG549-2u9HT ...
- OD使用教程5
怎样恢复数据被改过的代码 点击m进入内存分布图 双击进入文件头 将过大的值一一修改为正常值 普通程序没有动态链接表所以值改为0 保存:首先记住地址 其次 选中差不多的长度,保存 正常的程序
- VS 2010启动崩溃
事情缘由,同事装了一个软件不能用,我说我试下吧. 好吧,先装CAD2002,再装“截取断面工具”,好家伙,还是不能用,折腾了几遍还是不行,后来干脆不倒腾了. 打开VS,发现启动不了,显示 第一反应,I ...