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. 20145334赵文豪《网络对抗》shellcode注入&Return-to-libc攻击深入

    Shellcode注入 shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode 的地址 下载安装 ...

  2. Android Studio导入包

    1.复制jar包,打开工程,以project形式打开,在libs下面粘贴: 2.右键jar包,add as library.

  3. cogs 2223. [SDOI2016 Round1] 生成魔咒

    ★★☆ 输入文件:menci_incantation.in 输出文件:menci_incantation.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述]魔咒串由许多魔咒字符组 ...

  4. linux指定某用户某组挂载外接硬盘以便操作硬盘

    一.环境:发行版本:ubuntu 14.04 64bit 二.获取要指定的用户及组id 使用id命令 (笔者获取的uid和gid都为1000) 三.获取识别的硬盘路径 sudo fdisk -l  ( ...

  5. HDU3652 B-number(数位DP)题解

    思路: 这里的状态分为3种,无13和末尾的1,无13且末尾为1,有13,然后DFS 等我搞清楚数位DP就来更新Orz 代码: #include<iostream> #include< ...

  6. spring与spring-data-redis整合redis

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. 【分布式计算】30分钟概览Spark分布式计算引擎

    本文主要帮助初学者快速了解Spark,不会面面俱到,但核心一定点到. Spark是继Hadoop之后的下一代分布式内存计算引擎,于2009年诞生于加州大学伯克利分校AMPLab实验室,现在主要由Dat ...

  8. animate动画回调函数

    对非动画的实现排队,比如这个css()是要放在回调函数里才能,让前面的动画执行完成后在进行实现 $('button').click(function(event) { $(this).next().a ...

  9. 【译】第2节--- 什么是Code First?

    原文链接:http://www.entityframeworktutorial.net/code-first/what-is-code-first.aspx EF从EF4.1中引入了Code-Firs ...

  10. LA 4254 处理器(二分+贪心)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...