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. Codeforces 788A Functions again - 贪心

    Something happened in Uzhlyandia again... There are riots on the streets... Famous Uzhlyandian super ...

  2. 使用volley来json解析

    我对网络请求get和post的理解: 1.get只是从某网址获得固定数据,如我访问百度,返回就是百度的html语句: 2.post是我在访问的时候加了某些参数,如我访问某个服务器,访问的时候加了一些语 ...

  3. Metasploit应用举例

    本篇文章包含以下几方面内容: 1.Metasploit端口扫描: 2.用其他模块 3.metasploit smb获取系统信息 4.Metsploit服务识别 5.ftp识别: 6.metasploi ...

  4. ubuntu下进程kidle_inject致使编译软件很慢

    一.背景 某一天编译一个程序发现半天都没编译ok,于是使用top一看发现有个别进程占用cpu奇高,遂出此文 二.怎么解决? 2.1 什么进程占据很高cpu 名为kidle_inject,同时开启了好几 ...

  5. 格子中输出|2015年蓝桥杯B组题解析第四题-fishers

    StringInGrid函数会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏上一点. 下面的程序实现 ...

  6. 【第三十二章】 elk(3)- broker架构 + 引入logback

    实际中最好用的日志框架是logback,我们现在会直接使用logback通过tcp协议向logstash-shipper输入日志数据.在上一节的基础上修改!!! 一.代码 1.pom.xml 1 &l ...

  7. python 元组元素计数

    #create a tuple tuplex = , , , , , , , , print(tuplex) #return the number of times it appears in the ...

  8. ubuntu 14.04(desktop amd 64) nginx 安装启动停止

    sudo apt-get install nginx 关闭: sudo service nginx stop 启动: sudo nginx

  9. Kali Linux 2016.2初体验

    前言 Kali Linux官 方于8月30日发布Kali Linux 2016的第二个版本Kali Linux 2016.2.该版本距离Kali Linux 2016.1版本发布,已经有7个月.在这期 ...

  10. RabbitMQ入门_08_所谓的点对点与发布订阅模型

    A. JMS 模型 JMS 中定义了点对点和发布订阅两种消息模型,原来以为 AMQP 协议中 direct Exchange 对应点对点模型,topic Exchange 对应发布订阅模型,fanou ...