RestTemplate超时引发的血案

  • 时间:
  • 浏览:0
  • 来源:彩神大发快3_神彩大发快3官方

restTemplate.setRequestFactory(clientHttpRequestFactory);

故障总结,愿因问提的愿因有两方面:

RestTemplate restTemplate = new RestTemplate();

System.out.println("timeout = " + (System.currentTimeMillis() - start));

Assert.isTrue(timeout >= 0, "Timeout must be a non-negative value");

System.out.println("timeout = " + (System.currentTimeMillis() - start));

默认超时设置

.setConnectionManager(new PoolingHttpClientConnectionManager(3, TimeUnit.MINUTES))

* Set the connection timeout for the underlying HttpClient.

SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();

private static final int DEFAULT_READ_TIMEOUT_MILLISECONDS = (400 * 4000);

默认情形下是那末 超时设置的,此时超时依赖两方面:

Map responseObject = restTemplate.getForObject(QUERY_USER_RENEW_URL, Map.class);

 ●  spring-web不同版本设置RestTemplate最好的妙招不完整性一样。

RestTemplate restTemplate = new RestTemplate();

本文来自云栖社区相互相互合作伙伴“Java杂记”,了解相关信息都都要关注“Java杂记”。

愿因: RestTemplate继承自 HttpAccessor, 默认使用的 ClientHttpRequestFactory是 SimpleClientHttpRequestFactory

} catch (Exception e) {

.setDefaultRequestConfig(getRequestConfig())

long start = System.currentTimeMillis();

private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 5;

超时设置至关重要。实物依赖接口调用都都要通过Hystrix进行包装。 任何参数的设置都都要验证是是是不是都都要正常工作,都都要加入到测试环节中,方便在不同的依赖版本中进行验证。

spring-web 版本 4.3.0.RELEASE

}

try {

public abstract class HttpAccessor {

RestTemplate restTemplate = new RestTemplate();

requestFactory.setHttpClient(httpClient);

结论

//默认读取超时 400s

}

*/

System.out.println(responseObject);

}

数据库慢查询

restTemplate.setRequestFactory(clientHttpRequestFactory);

 ●  设置了 HttpClient的超时时间, 不设置 ConnectionManager 超时生效

 ●  设置了 HttpClient的超时时间, 设置 ConnectionManager 超时生效 实在问提就在与不同的版本中 HttpComponentsClientHttpRequestFactory.createRequest 最好的妙招的实现逻辑不同。咋样不同,自己查看。:grin:

假若

Map responseObject = restTemplate.getForObject(url, Map.class);

那末 亲戚亲戚亲们使用 RestTemplate该咋样设置超时时间呢?

Assert.assertNotNull(e);

private static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 400;

但问提就处在在,公司实物使用的组件,完整性都是通过 HttpComponentsClientHttpRequestFactory 设置超时时间,却说通过设置 HttpComponentsClientHttpRequestFactory实物的 HttpClient设置的超时时间,假若设置了 HttpClient使用的 HttpClientConnectionManager,从而愿因了问提的处在。

/**

private Proxy proxy;

.build();

最近线上出了一次故障,收银台系统所有服务完整性假死。订单量瞬时下降,造成很大损失。

private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

try {

restTemplate.setRequestFactory(requestFactory);

* A timeout value of 0 specifies an infinite timeout.

} catch (Exception e) {

// 连接和读取超时完整性都是 -1, 也却说那末 超时设置。

System.out.println(responseObject);

protected final Log logger = LogFactory.getLog(getClass());

*/

假若要注意的是: HttpComponentsClientHttpRequestFactory底层使用了apache的 HttpClient,超时时间的设置实在是针对它进行设置的。

@Test

getHttpClient().getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout);

例子

spring-web 版本 4.3.11.RELEASE

private boolean bufferRequestBody = true;

却说就都都要通过给 RestTemplate设置一另另一个 亲戚亲戚亲们自己创建的,设置了超时时间的 ClientHttpRequestFactory来实现。

private int connectTimeout = -1;

/**

* Logger available to subclasses.

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();

* @param timeout the timeout value in milliseconds

}

clientHttpRequestFactory.setConnectTimeout(4000);

public void testRestTemplateWithRequestFactoryWithoutTimeOut() {

private int readTimeout = -1;

}

代码分析

问提代码&测试

long start = System.currentTimeMillis();

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();

 ●  设置了 HttpClient的超时时间, 不设置 ConnectionManager 超时生效

 ●  设置了 HttpClient的超时时间, 设置 ConnectionManager 超时不生效 (qiyue-store 却说曾经问提)

private static final int DEFAULT_CHUNK_SIZE = 4096;

RestTemplate超时设置

RestTemplate restTemplate = new RestTemplate();

//2.设置超时时间, 设置/不设置ConnectionManager

 ●  设置了 HttpClient的超时时间, 不设置 ConnectionManager 超时生效

 ●  设置了 HttpClient的超时时间, 设置 ConnectionManager 超时生效

依赖TCP连接本身生活的超时时间(tcp空闲连接,超过一定时间,连接会被关闭)。 请求所经过的网络节点的超时时间。e.g. 顶端经过nginx, nginx默认读取后端服务的超时时间是400s,却说超时时间在400s左右(日志显示稍微大一点,不用大却说)。

总结

public void setConnectTimeout(int timeout) {

 ●  设置了 HttpClient的超时时间, 不设置 ConnectionManager 超时生效

 ●  设置了 HttpClient的超时时间, 设置 ConnectionManager 超时生效

到此,假若就通过顶端提到的最好的妙招设置超时时间,那末 亲戚亲戚亲们的应用就不用有超时问提,却说用处在故障了。

HttpClient httpClient = HttpClientBuilder.create()

.setDefaultSocketConfig(getSocketConfig())

clientHttpRequestFactory.setReadTimeout(400);

private int chunkSize = DEFAULT_CHUNK_SIZE;

Assert.assertNotNull(e);

public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory {

由顶端的代码亲戚亲戚亲们了解到,超时设置实在应该通过实物的 ClientHttpRequestFactory 来设置的。

clientHttpRequestFactory.setReadTimeout(400);

spring-web 版本 4.0.9.RELEASE

HttpComponentsClientHttpRequestFactory

原文发布时间为:2018-11-23

spring-web 版本 3.2.0

clientHttpRequestFactory.setConnectTimeout(4000);

}

private HttpClient httpClient;