超時處理

在 HTTP 元件的上下文中,需要考慮兩個計時區域:

  • 與 Spring Integration 通道互動時的超時

  • 與遠端 HTTP 伺服器互動時的超時

元件與訊息通道互動,可以為這些通道指定超時。例如,HTTP 入站閘道器將從連線的 HTTP 客戶端收到的訊息轉發到訊息通道(使用請求超時),隨後 HTTP 入站閘道器從回覆通道(使用回覆超時)接收回復訊息,該訊息用於生成 HTTP 響應。下圖提供了直觀的解釋:

http inbound gateway
圖 1. 超時設定如何應用於 HTTP 入站閘道器

對於出站端點,我們需要考慮在與遠端伺服器互動時計時的工作方式。下圖顯示了此場景:

http outbound gateway
圖 2. 超時設定如何應用於 HTTP 出站閘道器

您可能希望在使用 HTTP 出站閘道器或 HTTP 出站通道介面卡發出活動的 HTTP 請求時配置與 HTTP 相關的超時行為。在這些情況下,這兩個元件都使用 Spring 的 RestTemplate 支援來執行 HTTP 請求。

要配置 HTTP 出站閘道器和 HTTP 出站通道介面卡的超時,您可以直接引用一個 RestTemplate bean(透過使用 rest-template 屬性),或者可以提供對 ClientHttpRequestFactory bean 的引用(透過使用 request-factory 屬性)。Spring 提供了 ClientHttpRequestFactory 介面的以下實現:

如果您沒有明確配置 request-factoryrest-template 屬性,則會例項化一個預設的 RestTemplate(它使用 SimpleClientHttpRequestFactory)。

在某些 JVM 實現中,URLConnection 類對超時的處理可能不一致。

例如,Java™ 平臺標準版 6 API 規範中關於 setConnectTimeout 的內容:

此方法的某些非標準實現可能會忽略指定的超時。要檢視設定的 connect timeout,請呼叫 getConnectTimeout()。

如果您有特定需求,您應該測試您的超時設定。考慮使用 HttpComponentsClientHttpRequestFactory,它反過來使用 Apache HttpComponents HttpClient,而不是依賴 JVM 提供的實現。

當您將 Apache HttpComponents HttpClient 與池化連線管理器一起使用時,您應該注意,預設情況下,連線管理器為給定路由建立的併發連線不超過兩個,總連線數不超過 20 個。對於許多實際應用程式,這些限制可能過於嚴格。有關配置此重要元件的資訊,請參閱 Apache 文件

以下示例透過使用 SimpleClientHttpRequestFactory 配置 HTTP 出站閘道器,該工廠配置了 5 秒的連線超時和讀取超時:

<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-timeoutreply-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。
© . This site is unofficial and not affiliated with VMware.