http连接重用

从一个主机向另外一个建立连接的过程时相当复杂的,而且包含了两个终端之间的很多包的交换,它是相当费时的。
连接握手的开销是很重要的,特别是对小量的HTTP报文。
如果打开的连接被重用来执行多次请求,那么就可以达到很高的数据吞吐量

持久性连接

http1.1强调的http连接默认情况可以被重用于多次请求
http1.0兼容的终端也可以使用相似的机制来明确的交流它们的偏好来保证连接处于活动状态,使用它来处理多个请求
http请求也可以保持空闲连接处于一段时间的活动状态,防止对相同目标主机的后续的请求。

保持连接活动的能力称为持久性连接
httpclient完全支持持久性连接

连接存活策略

HTTP规范没有规定一个持久连接应该存活多久,有些http服务器使用非标准的Keep-Alive头消息和客户端进行交互,服务器端会在数秒时间内保持连接。
HttpClient也会利用这个头消息,如果服务器返回的响应中没有包含Keep-Alive头消息,HttpClient会认为这个连接可以永远保持。
然后,很多服务器都会在不通知客户端的情况下,关闭一定时间内部活动的连接,来节省服务器资源。
在某些情况下默认的策略显得太乐观,我们可能需要自定义连接存活策略。

连接保持活跃策略

ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
 public long getKeepAliveDuration(HttpResponse response ,HttpContext context){
    //honor 'keep-alive' header 兑现'keep-alive头部信息'
   HeaderElementIterator it = new  BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
   while(it.hasNext()){
     HeaderElement he = it.nextElement();
     String param = he.getName();
     String value = he.getValue();
     if(value!=null && param.equalsIgnoreCase("timeout")){
       try{
           return Long.parseLong(value)*1000;
        }catch(NumberFormatException e){
           //转换错误
        }
    }
  }
   HttpHost host = (HttpHost) context.getAttribute(HttpClientContext.HTTP_TARGET_HOST);
   if("www.baidu.com".equalsIgnoreCase(target.getHostName())){
     // keep alive for 5 seconds only 只保持活动5秒
     return 5*1000;
  }else{
    // otherwise keep alive for 30 seconds 否则保持活动30秒
    return 30*1000;
  }
}
};
CloseableHttpClient client = HttpClients.custom()
                                      .setKeepAliveStrategy(myStrategy)
                                      .build();

httpclient 连接保持的更多相关文章

  1. Http持久连接与HttpClient连接池

    一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...

  2. Http 持久连接与 HttpClient 连接池

    一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...

  3. HttpClient连接池

    HttpClient连接池,发现对于高并发的请求,效率提升很大.虽然知道是因为建立了长连接,导致请求效率提升,但是对于内部的原理还是不太清楚.后来在网上看到了HTTP协议的发展史,里面提到了一个属性C ...

  4. httpClient 连接池问题出现403.9

    困扰了半个月时间终于找到连接池的问题,由于调用第三方有异常导致连接不能及时释放 所以写了一个定时扫描释放连接 监控连接池释放连接: public static class IdleConnection ...

  5. (五)HttpClient 连接超时及读取超时

    第一节: HttpClient 连接超时及读取超时 HttpClient连接超时及读取超时 httpClient在执行具体http请求时候 有一个连接的时间和读取内容的时间: HttpClient连接 ...

  6. HttpClient连接超时及读取超时

    HttpClient连接超时及读取超时 httpClient在执行具体http请求时候 有一个连接的时间和读取内容的时间: HttpClient连接时间 所谓连接的时候 是HttpClient发送请求 ...

  7. HttpClient连接池的一些思考

    前言 使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理.事实上,通过分析httpclien ...

  8. HttpClient实战三:Spring整合HttpClient连接池

    简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行H ...

  9. httpclient连接池在ES Restful API请求中的应用

    package com.wm.utils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http ...

  10. springboot使用RestTemplate+httpclient连接池发送http消息

    简介 RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.a ...

随机推荐

  1. 解决Vue循环中子组件不实时更新的问题

    问题描述 使用Element-UI中的table组件时会遇到一个常见的问题.当在el-table中调用子组件的时候会出现数据更新后,子组件没有重新渲染的问题. eg:资源列表中的健康度组件. 代码如下 ...

  2. noip杂题题解

    这道题没有什么可说的,先统计,然后几次快排,答案就出来了 Code(整齐但不简洁的代码) #include<iostream> #include<cstdio> #includ ...

  3. python装饰器,其实就是对闭包的使用。

    装饰器 理解装饰器要先理解闭包(在闭包中引用函数,可参考上一篇通过例子来理解闭包). 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 装饰器的实质就是对闭包的使用,原函数被 ...

  4. C# 用Linq查询DataGridView行中的数据是否包含(各种操作)

    http://blog.csdn.net/xht555/article/details/38685845 https://www.cnblogs.com/wuchao/archive/2012/12/ ...

  5. SPA (单页应用程序)

    单页Web应用 编辑 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用.单页应用程序 (SPA) 是加载单个HTML 页面并在用户与应用程 ...

  6. v-model双向数据绑定

    v-model双向数据绑定的修饰符 .lazy:失去焦点时数据进行双向的绑定 v-model.lazy=”message ” .number:前面输入数字,后面接着字母自动去除掉.v-model. n ...

  7. POJ 1753 Flip Game(bfs+位压缩运算)

    http://poj.org/problem?id=1753 题意:一个4*4的棋盘,只有黑和白两种棋子,每次翻转一个棋子,并且其四周的棋子也跟着翻转,求棋盘全为黑或全为白时所需的最少翻转次数. 思路 ...

  8. 使用wsHttpBinding构建Message安全模式和UserName授权

    http://www.cnblogs.com/artech/archive/2011/05/22/authentication_01.html https://www.cnblogs.com/Fran ...

  9. 学习mybatis-3 step by step 篇三

    动态 SQL if choose (when, otherwise) trim (where, set) foreach 动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分.比如: ...

  10. 怎样借助Python爬虫给宝宝起个好名字--python 学习

    每个人一生中都会遇到一件事情,在事情出现之前不会关心,但是事情一旦来临就发现它极其重要,并且需要在很短的时间内做出重大决定,那就是给自己的新生宝宝起个名字. 因为要在孩子出生后两周内起个名字(需要办理 ...