タイムアウト処理

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

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

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

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

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

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

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

HTTP 送信ゲートウェイまたは HTTP 送信チャネルアダプターを使用してアクティブな HTTP リクエストを行う場合、HTTP 関連のタイムアウト動作を構成することができます。これらのインスタンスでは、これら 2 つのコンポーネントは Spring の RestTemplate (Javadoc) サポートを使用して HTTP リクエストを実行します。

HTTP 送信ゲートウェイと HTTP 送信チャネルアダプターのタイムアウトを構成するには、RestTemplate Bean を直接参照するか(rest-template 属性を使用)、ClientHttpRequestFactory (Javadoc) Bean への参照を提供できます(request-factory 属性を使用)。Spring は、ClientHttpRequestFactory インターフェースの以下の実装を提供します。

request-factory 属性または rest-template 属性を明示的に構成しない場合、デフォルトの 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 のみを定義します。応答タイムアウトは、 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 アドレスに接続できます。