最近做一个项目时用到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. C# Winform学习--- 实现石头剪刀布的游戏

    本文使用winform实现简单的石头剪刀布的游戏,主要实现,电脑随机出拳,玩家手动点击出拳:实现简易背景图片3秒切换:简易统计信息. 1.效果图 2.实现代码 新建一个windows窗体程序,用数字1 ...

  2. javascript一些方法兼容

    javascript一些方法兼容 标签(空格分隔): javascript 方法收集 [TOC] Object.keys 参考地址 if (!Object.keys) Object.keys = fu ...

  3. 第六章 springboot + 事务(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...

  4. Java常用的7大排序算法汇总

    1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...

  5. BingMap

    Application name Key details BngMapTest Key:25nTPiuDe0kxITMR1ymE~j5IlskEImiwGsGmAnsCftQ~Ap0HigfJujLq ...

  6. JS的函数

    函数由四部分组成 function+function name+parameter+body 方法调用模式 Object.add(); 函数调用模式: add(3,4) 构造器调用模式:JS是基于原型 ...

  7. Angular解决双向数据绑定

    <!DOCTYPE html> <html ng-app="myApp1"><body><div ng-controller=" ...

  8. JSON字符串解析

    有时保存在数据库的数据是一串json字符串,需要进行读取的时候就需要解析操作. 简单介绍两种: 1.net.sf.json.* 2.com.alibaba.fastjson.* 需要的包自行下载. 第 ...

  9. MVC 单元测试

    1.新建mvc项目 添加controller 添加action 或者方法 public ActionResult Index(string str) { ViewBag.Teststr = str; ...

  10. 国内首个微信小程序开发者社区www.mntuku.cn

    微信小程序开发者社区-微信小程序开发教程-微信小程序最新资讯 - www.mntuku.cn .本站作为专业的微信小程序开发者社区为大家提供:微信小程序开发者交流平台,微信小程序开发教程,微信小程序定 ...