一.实现功能
解释三者的connectionRequestTimeout 、connectionTimeout、socketTimeout代表意义,进而了解三者的区别.
二.具体区别
1.connectionRequestTimout(单位是ms):指从连接池获取连接的timeout超出预设时间(
从连接池获取连接的超时时间,如果连接池里连接都被用了,且超过设定时间,就会报错connectionrequesttimeout,会抛出超时异常.
2.connetionTimeout(单位是ms):指客户端和服务器建立连接的timeout.
就是http请求的三个阶段,一:建立连接;二:数据传送;三,断开连接。如果与服务器(这里指数据库)请求建立连接的时间超过ConnectionTimeOut,就会抛 ConnectionTimeOutException,即服务器连接超时,没有在规定的时间内建立连接。
3.socketTimeout(单位是ms):指客户端从服务器读取数据的timeout超出预期设定时间,超出后会抛出SocketTimeOutException.
public class RequestConfig implements Cloneable {
/**
* Returns the timeout in milliseconds used when requesting a connection
* from the connection manager. A timeout value of zero is interpreted
* as an infinite timeout.
* <p>
* A timeout value of zero is interpreted as an infinite timeout.
* A negative value is interpreted as undefined (system default).
* </p>
* <p>
* Default: {@code -1}
* </p>
*/
public int getConnectionRequestTimeout() {
return connectionRequestTimeout;
}
/**
* Determines the timeout in milliseconds until a connection is established.
* A timeout value of zero is interpreted as an infinite timeout.
* <p>
* A timeout value of zero is interpreted as an infinite timeout.
* A negative value is interpreted as undefined (system default).
* </p>
* <p>
* Default: {@code -1}
* </p>
*/
public int getConnectTimeout() {
return connectTimeout;
}
/**
* Defines the socket timeout ({@code SO_TIMEOUT}) in milliseconds,
* which is the timeout for waiting for data or, put differently,
* a maximum period inactivity between two consecutive data packets).
* <p>
* A timeout value of zero is interpreted as an infinite timeout.
* A negative value is interpreted as undefined (system default).
* </p>
* <p>
* Default: {@code -1}
* </p>
*/
public int getSocketTimeout() {
return socketTimeout;
}
}
示例:
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000).setConnectTimeout(5000).setSocketTimeout(30000)
.build();
private static final PoolingHttpClientConnectionManager POOL_CONN_MANAGER =
new PoolingHttpClientConnectionManager();
private static final RequestConfig REQ_CFG;
POOL_CONN_MANAGER.setMaxTotal(500);
POOL_CONN_MANAGER.setDefaultMaxPerRoute(POOL_CONN_MANAGER.getMaxTotal());
REQ_CFG =
RequestConfig.custom()
// 请求连接超时时间
.setConnectTimeout(100 * 1000)
// 获取数据超时时间
.setSocketTimeout(360 * 1000)
// 从链接池获取连接超时时间
.setConnectionRequestTimeout(5000)
.build();
CloseableHttpClient client=HttpClients.custom()
.setConnectionManager(POOL_CONN_MANAGER)
.setDefaultRequestConfig(REQ_CFG)
.build();
1.RestTemplate超时
设置配置HttpComponentsClientHttpRequestFactory中的RequestConfig属性
RestTemplateConfig:
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* Created by qhong on 2018/9/10 17:53
**/
@Slf4j
@Configuration
public class RestTemplateConfig {
@Bean
@ConfigurationProperties(prefix = "rest.connection")
public HttpComponentsClientHttpRequestFactory httpRequestFactory() {
return new HttpComponentsClientHttpRequestFactory();
}
@Bean
public RestTemplate customRestTemplate(){
return new RestTemplate(httpRequestFactory());
}
}
application.properties:
#restTemplate配置
rest.connection.connectionRequestTimeout=30000
rest.connection.connectTimeout=30000
rest.connection.readTimeout=30000
或
#restTemplate配置
rest.connection.connection-request-timeout=30000
rest.connection.connect-timeout=30000
rest.connection.read-timeout=30000
spring.mvc.async.request-timeout
spring.mvc.async.request-timeout=20000,意思是设置超时时间为20000ms即20s
网友评论