HttpClient 设置超时问题

jps -lvm
jstack -l pid

requestConfig 设置timeout不生效

job出现卡死杜塞情况,查看线程如下
"dcpUpdateOtrAccessTokenCronJob::de.hybris.platform.servicelayer.internal.jalo.ServicelayerJob" prio=5 tid=0x54068 nid=0xd334 RUNNABLE (JNI Native Code) - stats: cpu=344392 blk=-1 wait=-1
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
原因:高并发,cpu线程切换频繁,时候会出现SocketInputStream.socketRead0问题
解决方案:
设置httpclien的请求超时时间
代码如下
requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIME_OUT).setConnectionRequestTimeout(CONNECT_TIME_OUT)
.setSocketTimeout(CONNECT_TIME_OUT).setProxy(proxy).build();
这是超时时间之后,发现设置的timeout并不起作用(疑似没有生效),怀疑有重试机制(查资料发现defaultRetryHandle会重试三次),设置retryHandle
private HttpRequestRetryHandler otrRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception,
int executionCount, HttpContext context) {
return false;
}};

CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(otrRetryHandler).build();(测试没效果,连第三方系统还是挂掉了)

可以设置最大连接数
CloseableHttpClient httpClient = HttpClients.custom().setMaxConnPerRoute(3).setMaxConnTotal(3);
MaxConnPerRoute 分配给同一个route的最大连接数 route是server机器到目标服务器的一条线路 MaxConnTotal连接池最大连接数
譬如使用httpClient分别请求www.baidu.com 和 www.google.com获取资源,就会产生两个route

尝试发现以上方法不可行,现象是获取三方接口时,httpClient会卡死,异常如上,猜想第一次连接目标服务器就被挂起了,没有抛出预想当中的timeout异常

最后,尝试org.apache.commons.httpclient
httpClient也可以设置超时如下
httpClient.getParams().setConnectionManagerTimeout(60000);
httpClient.getParams().setSoTimeout(60000);
这种方式可以正常抛出预想当中的time out异常
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | java.net.SocketTimeoutException: Read timed out
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.socketRead0(Native Method)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.read(SocketInputStream.java:171)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at java.net.SocketInputStream.read(SocketInputStream.java:141)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
INFO | jvm 1 | main | 2018/12/26 20:52:34.118 | at sun.security.ssl.InputRecord.read(InputRecord.java:503)
INFO | jvm 1 | main | 2018/12/26 20:52:34.119 | at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
INFO | jvm 1 | main | 2018/12/26 20:52:34.119 | at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.jav

CloseableHttpClient不能抛出time out异常待验证

原文地址:https://www.cnblogs.com/Devin-Wang/p/10183633.html

时间: 2024-11-07 21:51:57

HttpClient 设置超时问题的相关文章

httpclient设置超时。

// 1.生成 HttpClinet 对象并设置参数 HttpClient httpClient = new DefaultHttpClient(); // 设置 HTTP 连接超时 5s httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); // 2.生成 GetMethod 对象并设置参数 HttpGet httpGet = new HttpGet(url); // 设置 get

httpClient请求超时的设置以及处理

设置超时的起因 在我们的httpClient请求,当我们的请求地址错误或者请求无法在正常时间内连接并且得到反馈抑或是我们的服务器正处在关闭维修的状态 ,这时,我们发送httpClient请求的客户端会因为线程中一直在等待我们请求的反馈信息而造成进程阻塞.如果这时候我们不做任何处理会造成客户端无反应(在安卓系统中会造成手机应用的崩溃),这时候,我们就需要设置请求httpClient的超时时间来解决这个麻烦. 在我们的httpClient请求类中生命一个变量来做httpClient请求 <span

HttpClient库设置超时

HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpClient httpClient=new DefaultHttpClient(); 4.3变成了工厂模式 CloseableHttpClient httpClient = HttpClients.createDefault(); 超时设置方法 3.x HttpClient client = new Ht

Axis2 客户端调用 设置超时时间

我用的是axis2-1.6.2版本.请看下面的客户端代码: import org.apache.axis2.client.Options; import com.ctis.ta.service.impl.OpenAccountForUnitServiceStub;import com.ctis.ta.service.impl.OpenAccountForUnitServiceStub.OpenAndCheck;import com.ctis.ta.service.impl.OpenAccount

apache httpclient4 设置超时时间

旧的方法(已被禁用) CloseableHttpClient httpclient = HttpClients.createDefault(); httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,5000); httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,5000); 新的方法 HttpPost httpp

socket为send和recv设置超时时间

linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别 UDP的socket在某些情况:如对方关闭时,本地可能sendto不出去数据,然后recvfrom就会被阻塞,这时就需要设置 这两个参数的值提高程序质量. linux: struct timeval timeout={3,0};//3s    int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeo

java测试网络连接是否成功并设置超时时间

/** * 获取RMI接口状态 * * @return "0":服务正常,"1": 连接报错,"2":连接超时 */ @Override public String getRMIJkzt() { final ExecutorService es = Executors.newFixedThreadPool(1); Callable<String> callable = new Callable<String>() {//使

设置超时时间(项目案例仅供参考)

#设置超时时间爬取网页速度相对要快些#encoding:utf8from lxml import etree#xpathimport re#正则import time#时间import requests#传值from selenium import webdriver#通用阅览器from selenium.webdriver.support.ui import WebDriverWait#引用超时模块import random#自定义模块url = '(网址)'driver = webdrive

C# UdpClient 设置超时时间

/********************************************************************** * C# UdpClient 设置超时时间 * 说明: * 网络通信中设置超时时间是常有的时,记录UDP获取.发送超时设置方法. * * 2016-12-8 深圳 南山平山村 曾剑锋 *********************************************************************/ 一.参考文档: 1. Can