Springboot調(diào)整接口響應(yīng)返回時(shí)長(zhǎng)詳解(解決響應(yīng)超時(shí)問(wèn)題)
配置Http會(huì)話超時(shí)
可以通過(guò)兩種方式為Spring Boot應(yīng)用程序配置HTTP會(huì)話超時(shí)。
application.properties中配置會(huì)話超時(shí)
最簡(jiǎn)單的方法是在你的application.properties中加入?yún)?shù)server.servlet.session.timeout。比如說(shuō)
server.servlet.session.timeout=60s
還要注意的是,Tomcat不允許你將超時(shí)時(shí)間設(shè)置得少于60秒。
以程序方式配置會(huì)話超時(shí)
假設(shè)我們想讓我們的HttpSession只持續(xù)兩分鐘。為了實(shí)現(xiàn)這一點(diǎn),我們可以在我們的WebConfiguration類(lèi)中添加一個(gè)EmbeddedServletContainerCustomizer Bean,內(nèi)容如下。
@Configuration public class WebConfiguration { @Bean public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setSessionTimeout(2, TimeUnit.MINUTES); } }; } }
這里再給出一個(gè)使用Java 8和lambda表達(dá)式的捷徑寫(xiě)法。
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return (ConfigurableEmbeddedServletContainer container) -> { container.setSessionTimeout(2, TimeUnit.MINUTES); }; }
在應(yīng)用程序啟動(dòng)期間,Spring Boot自動(dòng)配置檢測(cè)到EmbeddedServletContainerCustomizer,并調(diào)用customize(…)方法,傳遞對(duì)Servlet容器的引用。
配置接口訪問(wèn)超時(shí)
SpringBoot設(shè)置接口訪問(wèn)超時(shí)時(shí)間有兩種方式
一、配置文件方式
在配置文件application.properties
中加了spring.mvc.async.request-timeout=120000
,意思是設(shè)置超時(shí)時(shí)間為120000ms即120s
# [設(shè)置接口的超時(shí)時(shí)間] spring.mvc.async.request-timeout=120000
二、配置Config配置類(lèi)
還有一種就是在config配置類(lèi)中加入:
public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configureAsyncSupport(final AsyncSupportConfigurer configurer) { configurer.setDefaultTimeout(20000); configurer.registerCallableInterceptors(timeoutInterceptor()); } @Bean public TimeoutCallableProcessingInterceptor timeoutInterceptor() { return new TimeoutCallableProcessingInterceptor(); } }
采用上面的兩種配置之一后,重新運(yùn)行服務(wù),調(diào)用接口最大等待的響應(yīng)時(shí)間為上面設(shè)置的120s。
需要避免踩到的坑
如果按上述配置后,還是會(huì)出現(xiàn)超時(shí)情況,有可能是以下幾種技術(shù)的問(wèn)題,需要對(duì)應(yīng)設(shè)置一下。
tomcat的設(shè)置
上文中是springboot開(kāi)發(fā)環(huán)境,使用了內(nèi)置的tomcat。而在實(shí)際生產(chǎn)環(huán)境中一般用的是外置tomcat來(lái)部署(便于后續(xù)發(fā)布更新),需要在tomcat的配置文件server.xml中設(shè)置超時(shí)時(shí)間(默認(rèn)20秒以下設(shè)置為120秒)。
<Connector port="8811" protocol="HTTP/1.1" connectionTimeout="120000" redirectPort="8443" />
Nginx的設(shè)置
如果服務(wù)端使用到Nginx做了反向代理轉(zhuǎn)發(fā)請(qǐng)求,就需要在Nginx的配置文件nginx.conf中設(shè)置超時(shí)時(shí)間,否則會(huì)返回“java.io.IOException: 你的主機(jī)中的軟件中止了一個(gè)已建立的連接”這樣的異常提示。
未設(shè)置時(shí)Nginx響應(yīng)時(shí)間默認(rèn)60秒,這里我將http頭部的keepalive_timeout
、client_header_timeout
、client_body_timeout
、send_timeout
、以及server代碼塊中的proxy_read_timeout
均配置為120秒。
http { include mime.types; default_type application/octet-stream; client_max_body_size 100m; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 120; #連接超時(shí)時(shí)間,服務(wù)器將會(huì)在這個(gè)時(shí)間后關(guān)閉連接 send_timeout 120; #發(fā)送超時(shí)時(shí)間 client_header_timeout 120; #請(qǐng)求頭的超時(shí)時(shí)間 client_body_timeout 120; #請(qǐng)求體的讀超時(shí)時(shí)間 #gzip on; ..... #業(yè)務(wù)系統(tǒng)的配置 server { listen 9092; server_name localhost; location / { proxy_pass http://127.0.0.1:8811/mywebsev/; proxy_read_timeout 120; # 等候后端服務(wù)器響應(yīng)時(shí)間 秒 } } }
參考文章
springboot:實(shí)現(xiàn)異步響應(yīng)請(qǐng)求(解決前端請(qǐng)求超時(shí)的問(wèn)題)
總結(jié)
到此這篇關(guān)于Springboot調(diào)整接口響應(yīng)返回時(shí)長(zhǎng)(解決響應(yīng)超時(shí)問(wèn)題)的文章就介紹到這了,更多相關(guān)Springboot調(diào)整接口響應(yīng)返回時(shí)長(zhǎng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)
下面小編就為大家?guī)?lái)一篇淺談常用字符串與集合類(lèi)轉(zhuǎn)換的工具類(lèi)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08Spring Security整合KeyCloak保護(hù)Rest API實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Spring Security整合KeyCloak保護(hù)Rest API實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11解決后端傳long類(lèi)型數(shù)據(jù)到前端精度丟失問(wèn)題
這篇文章主要介紹了解決后端傳long類(lèi)型數(shù)據(jù)到前端精度丟失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01mac下idea的svn密碼記不住的問(wèn)題及處理方法
這篇文章主要介紹了mac下idea的svn密碼記不住的問(wèn)題及處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09解決RestTemplate 的getForEntity調(diào)用接口亂碼的問(wèn)題
這篇文章主要介紹了解決RestTemplate 的getForEntity調(diào)用接口亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java微信開(kāi)發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證
這篇文章主要為大家詳細(xì)介紹了java微信開(kāi)發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下2016-06-06Idea中Java項(xiàng)目如何修改項(xiàng)目名
這篇文章主要介紹了Idea中Java項(xiàng)目如何修改項(xiàng)目名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06基于Spring-AOP實(shí)現(xiàn)自定義分片工具詳解
隨著數(shù)據(jù)量的增長(zhǎng),在與其他系統(tǒng)交互時(shí),批量接口會(huì)出現(xiàn)超時(shí)現(xiàn)象,發(fā)現(xiàn)原批量接口在實(shí)現(xiàn)時(shí),沒(méi)有做分片處理。由于與其他系統(tǒng)交互比較多,一個(gè)一個(gè)接口去做分片優(yōu)化,改動(dòng)量較大,所以考慮通過(guò)AOP解決此問(wèn)題,感興趣的可以了解一下2022-11-11