httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法
- 原因: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 错误原因和解决方法的更多相关文章
- tomcat filewatchdog but has failed to stop it原因以及解决方法
停止tomcat,有些时候会报The web application [/XXX] appears to have started a thread named [FileWatchdog] but ...
- [转载]mysqlcreate新建用户host使用%,本地无法连接原因及解决方法
转载自 http://www.2cto.com/database/201307/225781.html mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语 ...
- Apache -- XAMPP Apache 无法启动原因及解决方法
XAMPP Apache 无法启动原因1(缺少VC运行库): 这个就是我遇到的问题原因,下载安装的XAMPP版本是xampp-win32-1.7.7-VC9,而现有的Windows XP系统又没有安装 ...
- Apache服务器出现Forbidden 403错误提示的解决方法总结
在配置Linux的 Apache服务时,经常会遇到http403错误,我今天配置测试时也出现了,最后解决了,总结了一下.http 403错误是拒绝访问的意思,有很多原因的.还有,这些问题在win平台的 ...
- SSH连接时出现Host key verification failed的原因及解决方法
SSH连接的时候Host key verification failed. [root@cache001 swftools-0.9.0]# ssh 192.168.1.90@@@@@@@@@@@@@@ ...
- apache 指定的网络名不再可用 原因及解决方法
1.出现问题状况: 出现问题网站:http://www.ayyzz.cn/ 前段时间作文大全网出现有时候比较慢,有时候“找不到网页”404错误:另外在error.log里也报错: [Mon May 0 ...
- Apache ab压力测试时出现大量的错误原因分析
最近有一个测试任务,是测试nginx的并发请求到底能够达到多少的, 于是就用ab工具对其进行压力测试. 这压力测试一执行,问题就来了:发起10000次请求,并发100,错误的情况能达到30%--50% ...
- 转:Validation of viewstate MAC failed异常的原因及解决方法
ViewState是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传.也就是说在页面刷新或者回传的时候控件的值将被清空,我们在aspx.c ...
- 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 ...
随机推荐
- 【334】Python Object-Oriented Programming
Reference: Python中self用法详解 __init__ 方法: 私有变量. Reference: [290]Python 函数 class 里面的 function 创建与此一致,只是 ...
- ConcurrentHashMap的简单理解
一.效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一个线程访问HashTable的同 ...
- Ubuntu-Tensorflow 程序结束掉GPU显存没有释放的问题
笔者在ubuntu上跑Tensorflow的程序的时候,中途使用了Win+C键结束了程序的进行,但是GPU的显存却显示没有释放,一直处于被占用状态. 使用命令 nvidia-smi 显示如下 两个GP ...
- PHP ImageMagick
简介: ImageMagick是用C语言开发图片处理程序.可以对图片进行改变大小.旋转.锐化.减色或增加特效等操作.对图片的操作,即可以通过命令行进行,也可以用C/C++.Perl.Jav ...
- 【转】字符串匹配的KMP算法:移动位数 = 已匹配 - 部分匹配值(共有长度)
计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算 ...
- WebClient使用与IIS7最大上传文件--升级&引导窗口&目录同步完整解决方法
IIS7最大上传文件说明:http://www.mzwu.com/article.asp?id=2449 WebClient使用说明使用using 及时回收资源 using(var wc=new W ...
- 命令行传递参数并排序 AS实现加法
题目:从命令行输入参数并进行排序 1.实验准备 Integer提供了能在 int 类型和 String 类型之间互相转换的方法,还提供了处理 int 类型时非常有用的其他一些常量和方法. static ...
- awk基础01-基本用法
什么是awk awk 是一门解释型的编程语言,支持条件判断,数组.循环等功能.可用于文本处理.输出格式化的文本信息.执行数学运算.字符串等操作. awk在处理文件时按行进行逐行处理,即 ...
- Linux 基础教程 42-xargs命令
xargs是execute arguments的缩写,主要作用是从标准输入中读取内容,并将此内容传递给它要协助的命令,并作为要协助命令的参数来执行. 基本语法 xargs [选项] [命令] ...
- (字符串) Hidden String -- HDU -- 5311
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5311 Time Limit: 2000/1000 MS (Java/Others) Memory ...