private SocketConfig resolveSocketConfig(final HttpHost host) {
SocketConfig socketConfig = this.configData.getSocketConfig(host);
if (socketConfig == null) {
socketConfig = this.configData.getDefaultSocketConfig();
if (socketConfig == null) {
socketConfig = SocketConfig.DEFAULT;
return socketConfig;
从上面的 this.configData.getDefaultSocketConfig();入手,设置DefaultSocketConfig();
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(httpConfig.getConnectTimeout())
.setSocketTimeout(httpConfig.getReadTimeout())
.setProxy(httpConfig.getProxy())
.setRedirectsEnabled(httpConfig.isRedirect()).build();
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
getSSLContext(), new String[]{"TLSv1"}, null,
NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(config).setSSLSocketFactory(sslSocketFactory)
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36")
.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(40000).build()).build();
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
重点就是加了一行代码:.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(40000).build())
问题描述:项目场景:实际项目创建一个固定数量的线程池,用来消费用户数据,但偶尔会发现有些线程消失了,也就是线程不进行工作,实际工作的线程数量一直减少,直至彻底不消费用户数据。Executor executor = Executors.newFixedThreadPool(100);原因分析:首先排除代码的逻辑错误,确保没有出现死锁等情况。在确保没有死锁的情况下,通过Thread Dump得到日志进一步分析。"pool-6-thread-29" #118 prio=5 os_prio=0 ti
public static String post(String url, String params){
log.info("post url:" + url + " params:" + params);
String responseStr = "";
try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost(url);
StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8"));
httpPost.setHeader("Content-type", "application/json");
httpPost.setEntity(stringEntity);
Closeable
日志如下:
2017-12-25 09:08:26,001 [http-nio-8080-exec-8] DEBUG o.a.h.wire - http-outgoing-322 >> "Connection: Keep-Alive[\r][\n]"
2017-12-25 09:08:26,00
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.S...
在socket中服务器与客户端进行通信,当其中一方调用close(即这一方会发送一个fin)关闭套接字之后,另一方read()会返回一个0。
我之前编写的一个服务器与客户端通信(一个服务器只连接一个客户端):服务器开两个进程,一个用于接收客户端发送的数据,另一个进程用于
向客户端发送数据。客户端开两个进程也是一个用于发送数据一个用于接收数据。由于创建了两个进程,那么套接字的引用计数都为2,只有...
一次完整的http
请求包含 建立连接、传输数据、断开连接。
ConnectionTimeOut 是指建立连接的时候就超时了,没有连接到对方。表现形式:
java.net.ConnectException:
Connection refused: connect
SocketTimeOut 是指已经建立连接了,但是在服务器没有在规定的时间内传输数据给客户端,有可能是对方处理数据慢
导致超时,表现形式:
java.net.
SocketTimeoutException:
Read timed out
连接池技术作为创建和管理连接的缓冲池技术,目前已广泛用于诸如数据库连接等长连接的维护和管理中,能够有效减少系统的响应时间,节省服务器资源开销。其优势主要有两个:其一是减少创建连接的资源开销,其二是资源的访问控制。连接池管理的对象是长连接,对于HTTP连接是否适用,我们需要首先回顾一下长连接和短连接。
所谓长连接是指客户端与服务器端一旦建立连接以后,可以进行多次数据传输而不需重新建立连接,而短连接则每次数据传输都需要客户端和服务器端建立一次连接。长连接的优势在于省去了每次数据传输连接建立的时间开销,能够大幅度
public class TestMain {
public static void main(Str
ing[] args) throws NSQException, TimeoutException {
ExecutorService
pool = Executors.newCachedTh
readPool();
//超时设置
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(400).set
SocketTimeout(400).build();
request.setEntity(s);
requ...
查阅发现一个jdk的问题
SocketInputStream.socketRead0 can hang even with soTimeout set
Bug Database_socketRead0
2.官方在16年以做出修改
3.comments
The customer tested with the attached native tests. Both the poll (which mi
当 HttpClient 发送 POST 请求时,有可能会遇到服务器返回 302 的情况。这种情况通常是因为服务器需要进行重定向,而 HttpClient 默认是不会自动进行重定向的。
解决这个问题的方法,可以通过设置 HttpClient 的 RedirectStrategy 属性来实现自动重定向。下面是一个示例代码:
```java
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("param1", "value1"));
params.add(new BasicNameValuePair("param2", "value2"));
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(60000)
.setConnectTimeout(60000)
.setRedirectsEnabled(true) // 允许自动重定向
.build();
httpPost.setConfig(requestConfig);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
// 处理正常情况的响应结果
} else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_MOVED_PERMANENTLY) {
// 处理重定向情况
String redirectUrl = httpResponse.getFirstHeader("Location").getValue();
// 重新发送请求,并处理响应结果
// ...
在上面的代码中,我们通过设置 RequestConfig 的 setRedirectsEnabled(true) 来允许自动重定向。当服务器返回 302 状态码时,我们可以从响应头中获取重定向的 URL,然后重新发送请求并处理响应结果。