java中http請求之restTemplate配置超時(shí)時(shí)間問題解決
問題:http請求發(fā)起后接收不到返回?cái)?shù)據(jù)?。?!【測試環(huán)境沒出問題,發(fā)到正式環(huán)境就有問題】
項(xiàng)目中通過restTemplate發(fā)起請求:
log.info("請求入?yún)?{}",JSON.toJSONString(request));//打印日志1
// 配置http請求的連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間
HttpsClientRequestFactory factory = new HttpsClientRequestFactory();
factory.setConnectTimeout(60 * 1000);
factory.setReadTimeout(5 * 60 * 1000);
RestTemplate restTemplate = new RestTemplate(factory);
Result<InventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);
log.info("庫存同步,返回?cái)?shù)據(jù): {}", result);//打印日志2打印日志1內(nèi)容為:
http請求入?yún)?{data=[{ productStatus=10,skuCode=null}], messageId=ewpfpr1t6ey5r6qj0su0w1h6rt73hr,token=vgvU5EJKuZbuHii7WH6pTINp40ZRicaqLz4dq5P7L6pDzWir8EEGZhCKPucQjljsw69EHasEy+iJfdTofDg==}
日志打印2沒有打印內(nèi)容?。?!
最后發(fā)現(xiàn)是因?yàn)闇y試環(huán)境中數(shù)據(jù)量較小,http請求后,很快能得到相應(yīng),而正式環(huán)境數(shù)據(jù)量較大,沒有及時(shí)得到響應(yīng),連接或者讀取超時(shí)?。?!
三種解決方式:
第一種
1、添加HttpsClientRequestFactory 類,并繼承SimpleClientHttpRequestFactory
/**
* 兼容調(diào)Https接口
*/
public class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod)
throws IOException {
if (connection instanceof HttpsURLConnection) {
prepareHttpsConnection((HttpsURLConnection) connection);
}
super.prepareConnection(connection, httpMethod);
}
private void prepareHttpsConnection(HttpsURLConnection connection) {
connection.setHostnameVerifier(new SkipHostnameVerifier());
try {
connection.setSSLSocketFactory(createSslSocketFactory());
}
catch (Exception ex) {
// Ignore
}
}
private SSLSocketFactory createSslSocketFactory() throws Exception {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[] { new SkipX509TrustManager() },
new SecureRandom());
return context.getSocketFactory();
}
private class SkipHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}
private static class SkipX509TrustManager implements X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
}
}2、使用restTemplate發(fā)起請求前先設(shè)置連接和超時(shí)時(shí)間即可;
//配置http請求的連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間 HttpsClientRequestFactory factory = new HttpsClientRequestFactory(); factory.setConnectTimeout(60 * 1000); factory.setReadTimeout(5 * 60 * 1000); RestTemplate restTemplate = new RestTemplate(factory); BaseResult<QueryInventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);
或者通過容器加載配置類,然后設(shè)置超時(shí)時(shí)間進(jìn)去,使用的時(shí)候直接注入restTemplate即可!;
@Configuration
public class RestConfig {
//60 * 1000
@Value("${rest.connectTimeout:60000}")
private int connectTimeout;
//5 * 60 * 1000
@Value("${rest.readTimeout:300000}")
private int readTimeout;
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory);
return restTemplate;
}第二種
@Configuration
public class RestConfig {
//60 * 1000
@Value("${rest.connectTimeout:60000}")
private int connectTimeout;
//5 * 60 * 1000
@Value("${rest.readTimeout:300000}")
private int readTimeout;
@Value("${rest.connectionRequestTimeout:300000}")
private int connectionRequestTimeout;
/**
* 使用 HttpComponentsClientHttpRequestFactory創(chuàng)建http請求(推薦)
*/
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);
httpRequestFactory.setConnectTimeout(connectTimeout);
httpRequestFactory.setReadTimeout(readTimeout);
return new RestTemplate(httpRequestFactory);
}
}第三種(基于第二種升級)
@Configuration
public class RestConfig {
/**
* 高并發(fā)采用HttpClient連接池
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(httpRequestFactory());
}
@Bean
public ClientHttpRequestFactory httpRequestFactory() {
return new HttpComponentsClientHttpRequestFactory(httpClient());
}
@Bean
public HttpClient httpClient() {
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
//設(shè)置整個(gè)連接池最大連接數(shù)
connectionManager.setMaxTotal(400);
//路由是對maxTotal的細(xì)分
connectionManager.setDefaultMaxPerRoute(100);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(30000) //返回?cái)?shù)據(jù)的超時(shí)時(shí)間
.setConnectTimeout(20000) //連接上服務(wù)器的超時(shí)時(shí)間
.setConnectionRequestTimeout(1000) //從連接池中獲取連接的超時(shí)時(shí)間
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}
}問題得到解決、、、、、、
到此這篇關(guān)于java中http請求之restTemplate配置超時(shí)時(shí)間的文章就介紹到這了,更多相關(guān)restTemplate配置超時(shí)時(shí)間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能
本文主要介紹了SpringBoot實(shí)現(xiàn)自定義指標(biāo)監(jiān)控功能的實(shí)現(xiàn),,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,感興趣的小伙伴跟著著小編來一起來學(xué)習(xí)吧2024-01-01
Java Spring MVC 上傳下載文件配置及controller方法詳解
這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
IntelliJ?IDEA?2023.1.4?無法刷新Maven項(xiàng)目模塊的問題及解決方法
這篇文章主要介紹了如何排查?IDEA?自身報(bào)錯問題,本文以IntelliJ?IDEA?2023.1.4無法刷新項(xiàng)目Maven模塊的問題為例,給大家詳細(xì)講解,需要的朋友可以參考下2023-08-08
Java設(shè)計(jì)模式詳解之門面模式(外觀模式)
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, Facade 模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。本文給大家介紹Java設(shè)計(jì)模式詳解之門面模式(外觀模式),感興趣的朋友參考下吧2016-04-04
Java使用flyway實(shí)現(xiàn)腳本自動化的方法詳解
Flyway是一個(gè)開源的數(shù)據(jù)庫版本控制工具,主要用于管理數(shù)據(jù)庫的版本和變更,它可以自動化地將數(shù)據(jù)庫遷移到不同的版本,同時(shí)支持多種數(shù)據(jù)庫類型,本文給大家介紹了如何使用flyway實(shí)現(xiàn)腳本自動化,需要的朋友可以參考下2023-10-10

