Resttemplate中設(shè)置超時(shí)時(shí)長(zhǎng)方式
Resttemplate 設(shè)置超時(shí)時(shí)長(zhǎng)
為了滿足調(diào)用需求,需要在使用Resttemplate發(fā)送請(qǐng)求時(shí),修改超時(shí)時(shí)長(zhǎng),網(wǎng)上給出了相關(guān)修改方法,代碼如下:
HttpComponentsClientHttpRequestFactory rf =
((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
rf.setConnectTimeout(30000);
rf.setReadTimeout(30000);
但是在運(yùn)行時(shí)報(bào)錯(cuò):
org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
restTemplate.getRequestFactory()返回的類型無(wú)法轉(zhuǎn)換,通過(guò)搜索和調(diào)試發(fā)現(xiàn),在resttemplate中,必須在設(shè)置攔截器之前設(shè)置超時(shí),因?yàn)樵谠O(shè)置攔截器后無(wú)法設(shè)置超時(shí),而我在設(shè)置中并沒(méi)有設(shè)置過(guò)攔截器,應(yīng)該是被默認(rèn)構(gòu)造了
所以解決方法如下:
restTemplate.setInterceptors(null);
HttpComponentsClientHttpRequestFactory rf =
((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
rf.setConnectTimeout(30000);
rf.setReadTimeout(30000);
在設(shè)置超時(shí)之前,先將攔截器置空,這樣就不會(huì)出現(xiàn)無(wú)法設(shè)置的問(wèn)題,之后驗(yàn)證通過(guò)。
查看resttemplate源碼后發(fā)現(xiàn),之所以會(huì)出現(xiàn)這樣的情況是因?yàn)樵趓esttemplate的源碼中,有這么一段代碼:
/**
* Return the request interceptor that this accessor uses.
*/
public List<ClientHttpRequestInterceptor> getInterceptors() {
return interceptors;
}
@Override
public ClientHttpRequestFactory getRequestFactory() {
ClientHttpRequestFactory delegate = super.getRequestFactory();
if (!CollectionUtils.isEmpty(getInterceptors())) {
return new InterceptingClientHttpRequestFactory(delegate, getInterceptors());
}
else {
return delegate;
}
}
可以看到,在getRequestFactory()函數(shù)中,本來(lái)應(yīng)該是返回ClientHttpRequestFactory類型的,但是它會(huì)先校驗(yàn)一次是否含有interceptors攔截器,如果攔截器非空,則會(huì)返回包含攔截器的InterceptingClientHttpRequestFactory,這樣是無(wú)法轉(zhuǎn)換為HttpComponentsClientHttpRequestFactory類型的,因此在前面處理的時(shí)候?qū)r截器置空,這樣就可以返回不含攔截器的所需對(duì)象。
RestTemplate 設(shè)置超時(shí)時(shí)間注意點(diǎn)
1、保證系統(tǒng)中只有一個(gè)RestTemplate的配置;不然可能與你的預(yù)期不一致。
2、永遠(yuǎn)不要太相信自己寫的代碼;多打印日志才能真正知道調(diào)用時(shí)間;
long s = System.currentTimeMillis();
try {
responseEntity = restTemplate.exchange();
} catch (Exception e) {
long costTime = System.currentTimeMillis()-s;
log.error("調(diào)用**服務(wù)異常,花費(fèi)時(shí)間:{},錯(cuò)誤:{}",costTime, e.getMessage(), e);
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 中HttpURLConnection附件上傳的實(shí)例詳解
這篇文章主要介紹了Java 中HttpURLConnection附件上傳的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能掌握這樣的知識(shí)內(nèi)容,需要的朋友可以參考下2017-09-09
Java輕松使用工具類實(shí)現(xiàn)獲取wav時(shí)間長(zhǎng)度
在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來(lái)獲取一個(gè)wav文件的時(shí)間長(zhǎng)度,感興趣的同學(xué)繼續(xù)往下閱讀吧2021-10-10
基于Java代碼實(shí)現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過(guò)一半
這篇文章主要介紹了基于Java代碼實(shí)現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的相關(guān)資料,需要的朋友可以參考下2016-02-02
Java裝飾器設(shè)計(jì)模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java裝飾器設(shè)計(jì)模式的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
解決IDEA service層跳轉(zhuǎn)實(shí)現(xiàn)類的快捷圖標(biāo)消失問(wèn)題
這篇文章主要介紹了解決IDEA service層跳轉(zhuǎn)實(shí)現(xiàn)類的快捷圖標(biāo)消失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法
這篇文章主要為大家詳細(xì)介紹了java根據(jù)網(wǎng)絡(luò)地址保存圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
網(wǎng)關(guān)Gateway過(guò)濾器的使用詳解
Gateway網(wǎng)關(guān)的過(guò)濾器分為兩種,一種是局部過(guò)濾器,一種是全局過(guò)濾器,過(guò)濾器就是過(guò)濾一些請(qǐng)求,在這里,全局過(guò)濾器的作用是處理一切進(jìn)入網(wǎng)關(guān)的請(qǐng)求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣,本文給大家介紹網(wǎng)關(guān)Gateway過(guò)濾器的使用,感興趣的朋友一起看看吧2022-07-07

