超時處理
在 HTTP 元件的上下文中,需要考慮兩個時間區域
-
與 Spring Integration 通道互動時的超時
-
與遠端 HTTP 伺服器互動時的超時
元件與訊息通道互動,可以為這些通道指定超時。例如,HTTP 入站閘道器將從連線的 HTTP 客戶端接收到的訊息轉發到訊息通道(使用請求超時),因此 HTTP 入站閘道器會從回覆通道(使用回覆超時)接收到用於生成 HTTP 響應的回覆訊息。下圖提供了直觀的解釋

對於出站端點,我們需要考慮與遠端伺服器互動時的時間控制方式。下圖展示了這種場景

當使用 HTTP 出站閘道器或 HTTP 出站通道介面卡發起主動 HTTP 請求時,您可能需要配置與 HTTP 相關的超時行為。在這些情況下,這兩個元件使用 Spring 的 RestTemplate
支援來執行 HTTP 請求。
要配置 HTTP 出站閘道器和 HTTP 出站通道介面卡的超時,可以直接引用一個 RestTemplate
bean(使用 rest-template
屬性),或者提供一個 ClientHttpRequestFactory
bean 的引用(使用 request-factory
屬性)。Spring 提供了 ClientHttpRequestFactory
介面的以下實現
-
SimpleClientHttpRequestFactory
: 使用標準的 J2SE 工具進行 HTTP 請求 -
HttpComponentsClientHttpRequestFactory
: 使用 Apache HttpComponents HttpClient (從 Spring 3.1 開始)
如果您沒有顯式配置 request-factory
或 rest-template
屬性,將例項化一個預設的 RestTemplate
(它使用 SimpleClientHttpRequestFactory
)。
在某些 JVM 實現中, 例如,來自 Java™ Platform, Standard Edition 6 API 規範關於 某些非標準實現可能會忽略指定的超時。要檢視設定的
如果您有特定需求,應該測試您的超時設定。考慮使用 |
當您使用帶有連線池管理器的 Apache HttpComponents HttpClient 時,應該注意,預設情況下,連線管理器為每個給定路由建立不超過兩個併發連線,並且總共不超過 20 個連線。對於許多實際應用來說,這些限制可能過於嚴格。請參閱 Apache 文件,瞭解如何配置此重要元件的資訊。 |
以下示例使用配置了連線超時和讀取超時均為 5 秒的 SimpleClientHttpRequestFactory
來配置 HTTP 出站閘道器
<int-http:outbound-gateway url="https://samples.openweathermap.org/data/2.5/weather?q={city}"
http-method="GET"
expected-response-type="java.lang.String"
request-factory="requestFactory"
request-channel="requestChannel"
reply-channel="replyChannel">
<int-http:uri-variable name="city" expression="payload"/>
</int-http:outbound-gateway>
<bean id="requestFactory"
class="org.springframework.http.client.SimpleClientHttpRequestFactory">
<property name="connectTimeout" value="5000"/>
<property name="readTimeout" value="5000"/>
</bean>
HTTP 出站閘道器
對於 HTTP 出站閘道器,XML Schema 僅定義了 reply-timeout。reply-timeout 對映到 org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler 類的 sendTimeout 屬性。更精確地說,該屬性設定在擴充套件的 AbstractReplyProducingMessageHandler
類上,最終在 MessagingTemplate
上設定該屬性。
sendTimeout 屬性的預設值為 30
秒,並將應用於連線的 MessageChannel
。這意味著,根據實現的不同,Message Channel 的 send 方法可能會無限期阻塞。此外,sendTimeout 屬性僅在實際的 MessageChannel 實現具有阻塞傳送(例如“滿”的有界 QueueChannel)時才使用。
HTTP 入站閘道器
對於 HTTP 入站閘道器,XML Schema 定義了 request-timeout
屬性,用於設定 HttpRequestHandlingMessagingGateway
類(在擴充套件的 MessagingGatewaySupport
類上)的 requestTimeout
屬性。您還可以使用 reply-timeout
屬性對映到同一類上的 replyTimeout
屬性。
這兩個超時屬性的預設值都是 1000ms
(一千毫秒或一秒)。最終,request-timeout
屬性用於設定 MessagingTemplate
例項上的 sendTimeout
。另一方面,replyTimeout
屬性用於設定 MessagingTemplate
例項上的 receiveTimeout
屬性。
要模擬連線超時,您可以連線到一個不可路由的 IP 地址,例如 10.255.255.10。 |