Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法
一、引言
隨著企業(yè)系統(tǒng)的發(fā)展,應(yīng)用多采用分布式結(jié)構(gòu),嚴(yán)重依賴(lài)于網(wǎng)絡(luò)的穩(wěn)定性。但由于網(wǎng)絡(luò)天生的不穩(wěn)定性,系統(tǒng)開(kāi)發(fā)過(guò)程中需要考慮網(wǎng)絡(luò)不穩(wěn)定情況下如何保證應(yīng)用的魯棒性。 設(shè)置網(wǎng)絡(luò)超時(shí)是其中一種保證應(yīng)用健壯性的手段。 設(shè)置網(wǎng)絡(luò)超時(shí)設(shè)置后,請(qǐng)求在設(shè)定時(shí)間能未完成將被強(qiáng)制終止,保證程序不出現(xiàn)無(wú)限制的線程阻塞情況,有效的提高了應(yīng)用的可用性。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
二、未設(shè)置超時(shí)與設(shè)置超時(shí)情況對(duì)比
1. 網(wǎng)絡(luò)請(qǐng)求圖例:

網(wǎng)絡(luò)請(qǐng)求超時(shí)案例
2. 設(shè)置超時(shí)時(shí)間后,請(qǐng)求圖例:

網(wǎng)絡(luò)請(qǐng)求超時(shí)案例-設(shè)置超時(shí)
三、常見(jiàn)的網(wǎng)絡(luò)超時(shí)設(shè)置
1. httpclient超時(shí)設(shè)置(Spring bean)
配置
<bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="maxTotalConnections" value="${maxTotalConnections:300}" />
<property name="defaultMaxConnectionsPerHost" value="${defaultMaxConnectionsPerHost:300}" />
<!-- 連接超時(shí),毫秒。 -->
<property name="connectionTimeout" value="${connectTimeout:10000}" />
<!-- socket超時(shí),毫秒。 -->
<property name="soTimeout" value="${readTimeout:600000}" />
<property name="staleCheckingEnabled" value="${staleCheckingEnabled:true}" />
</bean>
</property>
</bean>
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
<constructor-arg>
<ref bean="multiThreadedHttpConnectionManager" />
</constructor-arg>
</bean>
httpinvoker使用場(chǎng)景
配置HttpInvokerRequestExecutor,覆蓋HttpInvokerProxyFactoryBean中默認(rèn)使用的的SimpleHttpInvokerRequestExecutor,并配置網(wǎng)絡(luò)超時(shí)。見(jiàn)《配置》。
<bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
<constructor-arg>
<ref bean="httpClient" />
</constructor-arg>
</bean>
<bean id="xxxxService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="${xxxxServiceUrl}" />
<property name="serviceInterface" value="com.xxxxService" />
<property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor" />
</bean>
2. HttpClient超時(shí)設(shè)置(硬編碼)
樣例
RequestConfig config = RequestConfig.custom() .setSocketTimeout(1*1000) // socket套接字超時(shí),毫秒。 .setConnectionRequestTimeout(1*1000) //使用連接池來(lái)管理連接時(shí),從連接池獲取連接的超時(shí)時(shí)間,毫秒。 .setConnectTimeout(5*1000) // 連接建立超時(shí),毫秒。 .build(); CloseableHttpClient httpClient = HttpClients.custom() .setDefaultRequestConfig(config) // .build(); CloseableHttpResponse httpResponse = httpClient.execute(httpGet); // 執(zhí)行請(qǐng)求
3. 郵件超時(shí)設(shè)置
基于Spring框架開(kāi)發(fā)的項(xiàng)目可以很方便的使用
org.springframework.mail.javamail.JavaMailSenderImpl實(shí)現(xiàn)郵件提醒等功能。
配置
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"
p:host="${mailSender.host}" p:username="${mailSender.username}"
p:password="${mailSender.password}">
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mailSender.smtp.auth:true}
</prop>
<prop key="mail.smtp.timeout">${mailSender.smtp.timeout:10000}
</prop>
<prop key="mail.smtp.connectiontimeout">${mailSender.smtp.connectiontimeout:10000}
</prop>
</props>
</property>
</bean>
javaMailProperties說(shuō)明
- mail.smtp.timeout : smtp郵件服務(wù)器讀取超時(shí)。
- mail.smtp.connectiontimeout : smtp郵件服務(wù)器連接超時(shí)。
- mail.smtp.auth : 是否認(rèn)證用戶(hù)。
注: property參數(shù)名列表可查詢(xún)JavaMail API documentation。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
參考
- Java 網(wǎng)絡(luò)編程socket編程等詳解
- Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解
- 簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
- Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)教程
- Java套接字(Socket)網(wǎng)絡(luò)編程入門(mén)
- Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門(mén)實(shí)例
- java網(wǎng)絡(luò)編程之socket網(wǎng)絡(luò)編程示例(服務(wù)器端/客戶(hù)端)
- Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡(jiǎn)單端口掃描器示例
- Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
- 詳解Java網(wǎng)絡(luò)編程
相關(guān)文章
Mybatis實(shí)現(xiàn)自定義類(lèi)型轉(zhuǎn)換器TypeHandler的方法
Mybatis實(shí)現(xiàn)自定義的轉(zhuǎn)換器非常的簡(jiǎn)單,只需要三步就可以實(shí)現(xiàn)自定義類(lèi)型轉(zhuǎn)換器TypeHandler,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-07-07
SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法
這篇文章主要給大家介紹了關(guān)于SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04
SpringBoot+mybatis實(shí)現(xiàn)多數(shù)據(jù)源支持操作
這篇文章主要介紹了SpringBoot+mybatis實(shí)現(xiàn)多數(shù)據(jù)源支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Java Scanner對(duì)象中hasNext()與next()方法的使用
這篇文章主要介紹了Java Scanner對(duì)象中hasNext()與next()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Mybatis查詢(xún)方法如何實(shí)現(xiàn)沒(méi)有返回值
這篇文章主要介紹了Mybatis查詢(xún)方法如何實(shí)現(xiàn)沒(méi)有返回值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
詳解Spring Boot讀取配置文件與配置文件優(yōu)先級(jí)
這篇文章主要介紹了詳解Spring Boot讀取配置文件與配置文件優(yōu)先級(jí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Java開(kāi)發(fā)中最讓人頭疼的十個(gè)bug
這篇文章主要給大家總結(jié)介紹了關(guān)于Java開(kāi)發(fā)中最讓人頭疼的十個(gè)bug,同樣的bug信息,可能背后有千萬(wàn)種原因,而我,永遠(yuǎn)都不知道到底是哪一個(gè),努力通過(guò)代碼積累盡可能多的bug,并將它們進(jìn)行分類(lèi),可以幫你debug節(jié)省了時(shí)間,需要的朋友可以參考下2021-10-10

