最近做一个项目时用到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的更多相关文章

  1. 在Apache Tomcat 7设置redis作为session store

    在Apache Tomcat 7设置redis作为session store  //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...

  2. 记一次 XxlRpcException:xxl-rpc request timeout at 超时问题

    事件起因 昨天有同事找我到,说他搭建的 XXL-JOB 任务调度系统不能工作了,调用总是出错(服务端返回 500)希望我能帮忙处理一下,不过说实话我也没有搭建过 XXL-JOB 的经验,但是既然同事请 ...

  3. 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 ...

  4. [Windows Server 2008] Apache+PHP安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2008 ...

  5. [Windows Server 2012] Apache+PHP安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...

  6. apache环境.htaccess设置301跳转及常用.htaccess技巧整理

    apache环境.htaccess设置301跳转及常用.htaccess技巧整理 无论是Nginx,还是Apache都各自有优势,对于我们普通用户而言基本上也没有多大的区别.在虚拟主机环境中,基本上都 ...

  7. Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)

    Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...

  8. httpclient发送request请求时设置header和timeout

    package com.xxx.xxx.common; import java.io.BufferedReader; import java.io.InputStreamReader; import ...

  9. apache服务器参数设置

    全局参数设置 ServerRoot:服务器根目录 apache安装目录[我的为:/usr/local/apache/] 用于指定apache服务器的配置文件及日志文件存放的根目录.服务器的基础目录,a ...

随机推荐

  1. myeclipse10的激活

    myeclipse 提醒了我好几天要激活,今天操作了下,出现的问题分享一下. 在激活工具里面没有找到cracker.jar,按照指导双击run.bat,但是打开之后闪一下就自动关闭了,不得其解.然后搜 ...

  2. 利用Kinect将投影变得可直接用手操控

    Finally 总算是到了这一天了!假期里算法想不出来,或者被BUG折磨得死去活来的时候,总是YY着什么时候能心情愉快地坐在电脑前写一篇项目总结,今天总算是抽出时间来总结一下这神奇的几个月. 现在回过 ...

  3. curl详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  4. HibernateTemplate的一些常用方法总结

    1:get/load存取单条数据 public Teacher getTeacherById(Long id) { return (Teacher)this.hibernateTemplate.get ...

  5. 用muduo实现memcached协议的例子

    最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于 examples/memcached/server,能通过 memcached 的大部分测试用例(incr/dec ...

  6. final

    final的变量的值不能被改变.(包括形参) final的方法不能被重写. final的类不能被继承.

  7. 检查或遍历android手机应程

    检查android手机中是否存在某应程 public boolean checkApp(String packageName) {        if (packageName == null || ...

  8. 【动态规划】bzoj1642 [Usaco2007 Nov]Milking Time 挤奶时间

    区间按左端点排序,dp. #include<cstdio> #include<algorithm> using namespace std; #define N 1001 st ...

  9. java时区问题的一个坑

    事情是这样的,前台传过去一个日期字符串,就像2016/12/15 00:00,2016/12/15 23:59类似的格式,但每次从日志平台查日志查询的时间范围都不对,而是提前了一天. 原因是在java ...

  10. Cocostudio 文章列表

    Cocostudio 文章列表 Cocostudio(1) 容器层的使用- ScrollView ListView PageViewhttp://www.cnblogs.com/TS-qrt/arti ...