• 原因:httpclient 之前与服务端建立的链接已经失效(例如:tomcat 默认的keep-alive timeout :20s),再次从连接池拿该失效链接进行请求时,就会保存。
  • 解决方法:官方链接:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e659
  • 上面官方链接的2.6 解决方法的代码如果报错,可能是自己的httpclient版本 不适用。自己用的是httpclient 4.0.1,使用以下代码绿色代码:
    import com.google.api.client.http.ByteArrayContent;
    import com.google.api.client.http.GenericUrl;
    import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler;
    import com.google.api.client.http.HttpContent;
    import com.google.api.client.http.HttpHeaders;
    import com.google.api.client.http.HttpRequest;
    import com.google.api.client.http.HttpRequestFactory;
    import com.google.api.client.http.HttpResponse;
    import com.google.api.client.http.HttpStatusCodes;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.http.apache.ApacheHttpTransport;
    import com.google.api.client.util.BackOff;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ProxySelector;
    import java.util.Map;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.concurrent.TimeUnit;
    import javax.annotation.PreDestroy;
    import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.HeaderElement;
    import org.apache.http.HeaderElementIterator;
    import org.apache.http.HttpHost;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.ConnectionKeepAliveStrategy;
    import org.apache.http.conn.params.ConnManagerParams;
    import org.apache.http.conn.params.ConnPerRouteBean;
    import org.apache.http.conn.scheme.PlainSocketFactory;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
    import org.apache.http.impl.conn.ProxySelectorRoutePlanner;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.message.BasicHeaderElementIterator;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.protocol.HTTP;
    import org.apache.http.protocol.HttpContext; /**
    * @author Li Sheng
    */
    @Slf4j
    public class HttpClientUtils { private static HttpRequestFactory requestFactory;
    private static HttpTransport httpTransport;
    private static final String CONTENT_TYPE_JSON = "application/json"; private static final int CACHE_SIZE = 4096; static { HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setStaleCheckingEnabled(params, false);
    HttpConnectionParams.setSocketBufferSize(params, 245760); // 8k(8192) * 30
    ConnManagerParams.setMaxTotalConnections(params, 400);
    ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(200)); SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
    ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, registry); DefaultHttpClient defaultHttpClient = new DefaultHttpClient(connectionManager, params);
    defaultHttpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
    defaultHttpClient
    .setRoutePlanner(new ProxySelectorRoutePlanner(registry, ProxySelector.getDefault())); ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() {
    @Override
    public long getKeepAliveDuration(org.apache.http.HttpResponse httpResponse,
    HttpContext httpContext) {
    return 20 * 1000; // 20 seconds,because tomcat default keep-alive timeout is 20s
    }
    };
    defaultHttpClient.setKeepAliveStrategy(connectionKeepAliveStrategy); httpTransport = new ApacheHttpTransport(defaultHttpClient); requestFactory = httpTransport.createRequestFactory(); } @Data
    public static class PostParam { private Integer connectTimeoutMills; // 可选,默认 20s
    private Integer readTimeoutMills; // 可选,默认 20s
    private Map<String, String> headers; // 可选
    private String url; //必填
    private String postJson; //必填
    private Boolean readResponseData; //必填:是否需要读取数据。如果不需要返回结果,设置 false
    private BackOff backOff; //可选,重试机制策略
    private String authorization; //可选 public PostParam(String url, String postJson, boolean readResponseData) {
    this.url = url;
    this.postJson = postJson;
    this.readResponseData = readResponseData;
    }
    } public static String postWithJson(PostParam postParam) {
    GenericUrl genericUrl = new GenericUrl(postParam.getUrl());
    HttpContent httpContent = ByteArrayContent.fromString(null, postParam.getPostJson());
    HttpResponse httpResponse = null;
    try {
    HttpRequest httpRequest = requestFactory.buildPostRequest(genericUrl, httpContent);
    if (postParam.getConnectTimeoutMills() != null) {
    httpRequest.setConnectTimeout(postParam.getConnectTimeoutMills());
    }
    if (postParam.getReadTimeoutMills() != null) {
    httpRequest.setReadTimeout(postParam.getReadTimeoutMills());
    }
    if (postParam.getBackOff() != null) {
    httpRequest.setUnsuccessfulResponseHandler(
    new HttpBackOffUnsuccessfulResponseHandler(postParam.getBackOff()));
    } HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(CONTENT_TYPE_JSON);
    Map<String, String> headers = postParam.getHeaders();
    if (headers != null && headers.size() > 0) {
    headers.forEach(httpHeaders::set);
    }
    if (postParam.getAuthorization() != null && !postParam.equals("")) {
    httpHeaders.setAuthorization(postParam.getAuthorization());
    } httpRequest.setHeaders(httpHeaders);
    httpResponse = httpRequest.execute();
    if (httpResponse.getStatusCode() != HttpStatusCodes.STATUS_CODE_OK) {
    log.error("http status not 200. param:{},status:{},msg:{}", postParam,
    httpResponse.getStatusCode(), httpResponse.getStatusMessage());
    return null;
    }
    Boolean readResponseData = postParam.getReadResponseData();
    if (readResponseData != null && readResponseData) {
    InputStream inputStream = httpResponse.getContent();
    if (inputStream != null) {
    StringBuffer out = new StringBuffer();
    byte[] b = new byte[CACHE_SIZE];
    for (int n; (n = inputStream.read(b)) != -1; ) {
    out.append(new String(b, 0, n));
    }
    return out.toString();
    }
    }
    } catch (Exception e) {
    log.error("post exception,param:{}", postParam, e);
    } finally {
    try {
    if (httpResponse != null) {
    httpResponse.disconnect();
    }
    } catch (Exception e) {
    log.error("httpResponse disconnect exception", e);
    }
    }
    return null;
    } @PreDestroy
    public static void destory() {
    try {
    log.info("httpTransport shutdown now....");
    httpTransport.shutdown();
    } catch (IOException e) {
    log.error("shut down httpTransport exception", e);
    }
    } }
  • 如果想使用上面的 HttpClientUtils,必须引入 google-httpclient:
    •    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client</artifactId>
      <version>1.22.0</version>
      </dependency>

httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法的更多相关文章

  1. tomcat filewatchdog but has failed to stop it原因以及解决方法

    停止tomcat,有些时候会报The web application [/XXX] appears to have started a thread named [FileWatchdog] but ...

  2. [转载]mysqlcreate新建用户host使用%,本地无法连接原因及解决方法

    转载自 http://www.2cto.com/database/201307/225781.html mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语 ...

  3. Apache -- XAMPP Apache 无法启动原因及解决方法

    XAMPP Apache 无法启动原因1(缺少VC运行库): 这个就是我遇到的问题原因,下载安装的XAMPP版本是xampp-win32-1.7.7-VC9,而现有的Windows XP系统又没有安装 ...

  4. Apache服务器出现Forbidden 403错误提示的解决方法总结

    在配置Linux的 Apache服务时,经常会遇到http403错误,我今天配置测试时也出现了,最后解决了,总结了一下.http 403错误是拒绝访问的意思,有很多原因的.还有,这些问题在win平台的 ...

  5. SSH连接时出现Host key verification failed的原因及解决方法

    SSH连接的时候Host key verification failed. [root@cache001 swftools-0.9.0]# ssh 192.168.1.90@@@@@@@@@@@@@@ ...

  6. apache 指定的网络名不再可用 原因及解决方法

    1.出现问题状况: 出现问题网站:http://www.ayyzz.cn/ 前段时间作文大全网出现有时候比较慢,有时候“找不到网页”404错误:另外在error.log里也报错: [Mon May 0 ...

  7. Apache ab压力测试时出现大量的错误原因分析

    最近有一个测试任务,是测试nginx的并发请求到底能够达到多少的, 于是就用ab工具对其进行压力测试. 这压力测试一执行,问题就来了:发起10000次请求,并发100,错误的情况能达到30%--50% ...

  8. 转:Validation of viewstate MAC failed异常的原因及解决方法

    ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传.也就是说在页面刷新或者回传的时候控件的值将被清空,我们在aspx.c ...

  9. MySQL Host is blocked because of many connection errors 解决方法

    应用日志提示错误:create connection error, url: jdbc:mysql://10.45.236.235:3306/db_wang?useUnicode=true&c ...

随机推荐

  1. Spark报错:Failed to locate the winutils binary in the hadoop binary path

    之前在mac上调试hadoop程序(mac之前配置过hadoop环境)一直都是正常的.因为工作需要,需要在windows上先调试该程序,然后再转到linux下.程序运行的过程中,报 Failed to ...

  2. warning LNK4099: PDB 'vc100.pdb' was not found... 解决方案

    使用VS2010在编译得代码工程的时候,原本在debug下是没有问题,但是在release下编译始终会报: “warning LNK4099: PDB 'vc100.pdb' was not foun ...

  3. Visual Studio 使用Web Deploy发布项目

    工具:Web Deploy 3.6 点击下载 (强烈推荐使用独立的Web Deploy 安装包安装) 使用 Web Platform Installer 安装 Web Deploy(3.5,3.6都安 ...

  4. HDFS设计理念

    [HDFS设计理念] 1. 读取整个数据集的时间延迟比读取第一条记录的延迟更重要. 2. HDFS以高延迟为代价,要求低时间延迟数据访问的应用,不适合在HDFS上运行. 3. namenode决定了集 ...

  5. for 续4

    ---------siwuxie095             (四)tokens=x,y,m-n 显示指定的列     tokens=x 只显示第 x 列 tokens=x,y,z 只显示第 x,y ...

  6. centos6.5下使用yum完美搭建LNMP环境(php5.6)

    准备工作 配置防火墙,开启80端口.3306端口删除原有的 iptables , 添加合适的配置 rm -rf /etc/sysconfig/iptables vi /etc/sysconfig/ip ...

  7. Java程序设计8——抽象类、接口与内部类

    1 抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体.但在某些情况下,某个父类并不需要实现,因为它只需要当做一个模板,而具体的实现,可以由 ...

  8. linux 下 WebSphere日志中文乱码

    管理控制台--->服务器--->应用程序服务器--->server1--->java和进程管理--->进程定义--->java虚拟机--->将通用jvm参数设 ...

  9. UVa 11297 Census (二维线段树)

    题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...

  10. 对/proc/cpuinfo文件下的各个参数的说明及实践

    我们通常要检查系统的cpu的相关信息,之前在进行查看cpu的信息的时候,我最长用的方式 是,直接将/etc/cpuinfo下的所有的内容进行显示,然后通过对全部文件的查看,来提取我们需要的信息,虽然查 ...