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 ...
随机推荐
- 07-JAVA继承与接口
动手动脑: 源程序: public class FuGai { public static void main(String[] args) { // TODO Auto-generated meth ...
- WebService未能加载文件或程序集“ESRI.ArcGIS.XXX”或它的某一个依赖项
开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 编写ArcEngi ...
- 使用guava进行对字符串的加锁
java的synchronized关键字是堆某对象加锁,但是我们当需要对某个字符串加锁怎么办 比如对同一个订单只能有一个操作,但是对其他订单的操作不影响 使用 guava包下的 Interner 类 ...
- centos查看系统cpu个数、核心书、线程数
1.查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 2.查看核心数量 grep 'core id' /proc/cpuinfo ...
- Xcode7以后 使用空模板
Xcode7以后的版本没有空模板可以选择 习惯使用空模版的 可以自己拷贝空模版文件夹 放到模版的位置 重启就可以使用了 1:首先 需要有一个空模版 没有空模板的可以在下面路径下下载一个 并解压 htt ...
- 搭建高可用mongodb集群(二)—— 副本集
在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...
- 理解soft-clipped reads
什么是soft-clipped reads 当基因组发生某一段的缺失,或转录组的剪接,在测序过程中,横跨缺失位点及剪接位点的reads回帖到基因组时,一条reads被切成两段,匹配到不同的区域,这样的 ...
- [erlang]supervisor(监控树)的重启策略
1. init函数 init() -> {ok, {SupFlags, [ChildSpec,...]}} | ignore. [ChildSpec,...] 是在init之后默认要启动的子进程 ...
- win7环境下安装运行gotour【转载整理】
转载请注明出处:http://www.cnblogs.com/Vulpers/p/5562586.html 最近尝试学习golang,在某个网站(真忘了)上发现gotour是一款灰常叼的教程& ...
- LeetCode(97) Interleaving String
题目 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: ...