タイムアウト処理

HTTP コンポーネントのコンテキストでは、考慮する必要がある 2 つのタイミング領域があります。

  • Spring Integration チャネルと対話するときのタイムアウト

  • リモート HTTP サーバーと対話するときのタイムアウト

コンポーネントは、タイムアウトを指定できるメッセージチャネルと対話します。例: HTTP 受信ゲートウェイは、接続された HTTP クライアントから受信したメッセージを(リクエストタイムアウトを使用する)メッセージチャネルに転送し、その結果、HTTP 受信ゲートウェイは、生成に使用されるリプライチャネル(リプライタイムアウトを使用する)からリプライメッセージを受信します。HTTP レスポンス。次の図に視覚的な説明を示します。

http inbound gateway
図 1: タイムアウト設定が HTTP 受信ゲートウェイに適用される方法

送信エンドポイントの場合、リモートサーバーとの対話中にタイミングがどのように機能するかを考慮する必要があります。次の図は、このシナリオを示しています。

http outbound gateway
図 2: HTTP 送信ゲートウェイにタイムアウト設定を適用する方法

HTTP 送信ゲートウェイまたは HTTP 送信チャネルアダプターを使用してアクティブな HTTP リクエストを行う際に、HTTP 関連のタイムアウト動作を設定することができます。バージョン 7.1 以降、これらの送信 HTTP コンポーネントは、リクエスト実行に Spring の RestClient をサポートしています。RestTemplate ベースのエンドポイント設定は非推奨であり、将来のバージョンで削除される予定です。

HTTP 送信 ゲートウェイおよび送信 チャネルアダプターのタイムアウト設定には、rest-client 属性を持つ RestClient Bean を参照することをお勧めします。既存の RestTemplate カスタマイズを移行するには、RestClient.create(restTemplate) を使用して RestClient を作成し、rest-client で参照します。rest-template 属性は下位互換性のために引き続き使用できます。ClientHttpRequestFactory (Javadoc) Bean への参照 (request-factory 属性を使用) も指定できます。Spring は、ClientHttpRequestFactory インターフェースの次の実装を提供します。

request-factoryrest-templaterest-client 属性を明示的に設定しない場合、デフォルトの RestTemplate (SimpleClientHttpRequestFactory を使用)がインスタンス化されます。

一部の JVM 実装では、URLConnection クラスによるタイムアウトの処理に一貫性がない場合があります。

例: setConnectTimeout の Java ™ Platform、Standard エディション 6 API 仕様から:

このメソッドの非標準的な実装では、指定されたタイムアウトを無視する場合があります。connect timeout のセットを見るには、getConnectTimeout() を呼び出してください。

特定のニーズがある場合は、タイムアウトをテストする必要があります。HttpComponentsClientHttpRequestFactory の使用を検討してください。HttpComponentsClientHttpRequestFactory は、JVM が提供する実装に依存するのではなく、Apache HttpComponents HttpClient (英語) を使用します。

Apache HttpComponents HttpClient をプーリング接続マネージャーとともに使用する場合、デフォルトでは、接続マネージャーが特定のルートごとに作成する同時接続は 2 つまで、合計で 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 スキーマは reply-timeout のみを定義します。reply-timeout は、 org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler クラスの sendTimeout プロパティにマップされます。より正確には、プロパティは拡張された AbstractReplyProducingMessageHandler クラスに設定され、最終的には MessagingTemplate のプロパティが設定されます。

sendTimeout プロパティの値はデフォルトで 30 秒に設定され、接続された MessageChannel に適用されます。つまり、実装によっては、メッセージチャネルの送信メソッドが無期限にブロックされる可能性があります。さらに、sendTimeout プロパティは、実際の MessageChannel 実装がブロッキング送信(「完全」境界付き QueueChannel など)を持つ場合にのみ使用されます。

HTTP 受信ゲートウェイ

HTTP 受信ゲートウェイの場合、XML スキーマは request-timeout 属性を定義します。これは、HttpRequestHandlingMessagingGateway クラス(拡張 MessagingGatewaySupport クラス)で requestTimeout プロパティを設定するために使用されます。reply-timeout 属性を使用して、同じクラスの replyTimeout プロパティにマップすることもできます。

両方のタイムアウトプロパティのデフォルトは 1000ms (1000 ミリ秒または 1 秒)です。最終的に、request-timeout プロパティは、MessagingTemplate インスタンスで sendTimeout を設定するために使用されます。一方、replyTimeout プロパティは、MessagingTemplate インスタンスで receiveTimeout プロパティを設定するために使用されます。

接続タイムアウトをシミュレートするには、10.255.255.10 などのルーティング不可能な IP アドレスに接続できます。