逾時處理

在 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™ Platform, Standard Edition 6 API 規格中的 setConnectTimeout

此方法的某些非標準實作可能會忽略指定的逾時。若要查看設定的 connect timeout,請呼叫 getConnectTimeout()。

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

當您將 Apache HttpComponents HttpClient 與集區連線管理員搭配使用時,您應該注意,依預設,連線管理員針對給定路由建立的並行連線不超過兩個,總共不超過 20 個連線。對於許多真實世界的應用程式,這些限制可能證明過於嚴苛。請參閱 Apache 文件,以取得有關設定此重要元件的資訊。

以下範例使用 SimpleClientHttpRequestFactory 設定 HTTP 輸出閘道器,該 SimpleClientHttpRequestFactory 設定了連線和讀取逾時,分別為 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 方法可能會無限期地封鎖。此外,只有當實際的 MessageChannel 實作具有封鎖傳送(例如「已滿」的 bounded QueueChannel)時,才會使用 sendTimeout 屬性。

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。