java中http請求之restTemplate配置超時時間問題解決
問題:http請求發(fā)起后接收不到返回數(shù)據(jù)?。?!【測試環(huán)境沒出問題,發(fā)到正式環(huán)境就有問題】
項目中通過restTemplate發(fā)起請求:
log.info("請求入?yún)?{}",JSON.toJSONString(request));//打印日志1 // 配置http請求的連接超時時間和讀取超時時間 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("庫存同步,返回數(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)是因為測試環(huán)境中數(shù)據(jù)量較小,http請求后,很快能得到相應,而正式環(huán)境數(shù)據(jù)量較大,沒有及時得到響應,連接或者讀取超時?。?!
三種解決方式:
第一種
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ā)起請求前先設置連接和超時時間即可;
//配置http請求的連接超時時間和讀取超時時間 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);
或者通過容器加載配置類,然后設置超時時間進去,使用的時候直接注入restTemplate即可?。?/p>
@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ù) connectionManager.setMaxTotal(400); //路由是對maxTotal的細分 connectionManager.setDefaultMaxPerRoute(100); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(30000) //返回數(shù)據(jù)的超時時間 .setConnectTimeout(20000) //連接上服務器的超時時間 .setConnectionRequestTimeout(1000) //從連接池中獲取連接的超時時間 .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); } }
問題得到解決、、、、、、
到此這篇關于java中http請求之restTemplate配置超時時間的文章就介紹到這了,更多相關restTemplate配置超時時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java開發(fā)中如何使用JVisualVM進行性能分析
JVisualVM是由Sun提供的性能分析工具,如此強大的后盾怎能不強大?在Jdk6.0以后的版本中是自帶的,配置好環(huán)境變量然后在運行中輸入“JVisualVm”或直接到Jdk的安裝目錄的Bin目錄下找到運行程序即可運行。如果是用Jdk1.5或以前版本的朋友就得要單獨安裝了2015-12-12java微信企業(yè)號開發(fā)之發(fā)送消息(文本、圖片、語音)
這篇文章主要為大家詳細介紹了java微信企業(yè)號開發(fā)之發(fā)送消息,發(fā)送類型包括文本、圖片、語音,感興趣的小伙伴們可以參考一下2016-06-06MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā))
這篇文章主要介紹了MyBatis開發(fā)Dao層的兩種方式實現(xiàn)(原始Dao層開發(fā)),并對數(shù)據(jù)庫進行增刪查改,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Spring AOP如何整合redis(注解方式)實現(xiàn)緩存統(tǒng)一管理詳解
這篇文章主要給大家介紹了關于Spring AOP如何整合redis(注解方式)實現(xiàn)緩存統(tǒng)一管理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-08-08