一、引言
隨著企業系統的發展,應用多采用分佈式結構,嚴重依賴於網絡的穩定性。但由於網絡天生的不穩定性,系統開發過程中需要考慮網絡不穩定情況下如何保證應用的魯棒性。 設置網絡超時是其中一種保證應用健壯性的手段。 設置網絡超時設置後,請求在設定時間能未完成將被強制終止,保證程序不出現無限制的線程阻塞情況,有效的提高了應用的可用性。
下面話不多說了,來一起看看詳細的介紹吧。
二、未設置超時與設置超時情況對比
1. 網絡請求圖例:
網絡請求超時案例
2. 設置超時時間後,請求圖例:
網絡請求超時案例-設置超時
三、常見的網絡超時設置
1. httpclient超時設置(Spring bean)
配置
<bean id="multiThreadedHttpConnectionManager"> <property name="params"> <bean > <property name="maxTotalConnections" value="${maxTotalConnections:300}" /> <property name="defaultMaxConnectionsPerHost" value="${defaultMaxConnectionsPerHost:300}" /> <!-- 連接超時,毫秒。 --> <property name="connectionTimeout" value="${connectTimeout:10000}" /> <!-- socket超時,毫秒。 --> <property name="soTimeout" value="${readTimeout:600000}" /> <property name="staleCheckingEnabled" value="${staleCheckingEnabled:true}" /> </bean> </property> </bean> <bean id="httpClient"> <constructor-arg> <ref bean="multiThreadedHttpConnectionManager" /> </constructor-arg> </bean>httpinvoker使用場景
配置HttpInvokerRequestExecutor,覆蓋HttpInvokerProxyFactoryBean中默認使用的的SimpleHttpInvokerRequestExecutor,並配置網絡超時。見《配置》。
<bean id="httpInvokerRequestExecutor" > <constructor-arg> <ref bean="httpClient" /> </constructor-arg> </bean> <bean id="xxxxService" > <property name="serviceUrl" value="${xxxxServiceUrl}" /> <property name="serviceInterface" value="com.xxxxService" /> <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor" /> </bean>2. HttpClient超時設置(硬編碼)
樣例
RequestConfig config = RequestConfig.custom() .setSocketTimeout(1*1000) // socket套接字超時,毫秒。 .setConnectionRequestTimeout(1*1000) //使用連接池來管理連接時,從連接池獲取連接的超時時間,毫秒。 .setConnectTimeout(5*1000) // 連接建立超時,毫秒。 .build(); CloseableHttpClient httpClient = HttpClients.custom() .setDefaultRequestConfig(config) // .build(); CloseableHttpResponse httpResponse = httpClient.execute(httpGet); // 執行請求
3. 郵件超時設置
基於Spring框架開發的項目可以很方便的使用
org.springframework.mail.javamail.JavaMailSenderImpl實現郵件提醒等功能。
配置
<bean id="mailSender" 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說明
注: property參數名列表可查詢JavaMail API documentation。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
參考