タイムアウト処理
HTTP コンポーネントのコンテキストでは、考慮する必要がある 2 つのタイミング領域があります。
Spring Integration チャネルと対話するときのタイムアウト
リモート HTTP サーバーと対話するときのタイムアウト
コンポーネントは、タイムアウトを指定できるメッセージチャネルと対話します。例: HTTP 受信ゲートウェイは、接続された HTTP クライアントから受信したメッセージを(リクエストタイムアウトを使用する)メッセージチャネルに転送し、その結果、HTTP 受信ゲートウェイは、生成に使用されるリプライチャネル(リプライタイムアウトを使用する)からリプライメッセージを受信します。HTTP レスポンス。次の図に視覚的な説明を示します。
送信エンドポイントの場合、リモートサーバーとの対話中にタイミングがどのように機能するかを考慮する必要があります。次の図は、このシナリオを示しています。
HTTP 送信ゲートウェイまたは HTTP 送信チャネルアダプターを使用してアクティブな HTTP リクエストを行う場合、HTTP 関連のタイムアウト動作を構成することができます。これらのインスタンスでは、これら 2 つのコンポーネントは Spring の RestTemplate
(Javadoc) サポートを使用して HTTP リクエストを実行します。
HTTP 送信ゲートウェイと HTTP 送信チャネルアダプターのタイムアウトを構成するには、RestTemplate
Bean を直接参照するか(rest-template
属性を使用)、ClientHttpRequestFactory
(Javadoc) Bean への参照を提供できます(request-factory
属性を使用)。Spring は、ClientHttpRequestFactory
インターフェースの以下の実装を提供します。
SimpleClientHttpRequestFactory
(Javadoc) : HTTP リクエストを作成するために標準の J2SE 機能を使用しますHttpComponentsClientHttpRequestFactory
(Javadoc) : Apache HttpComponents HttpClient (英語) を使用 (Spring 3.1 以降)
request-factory
属性または rest-template
属性を明示的に構成しない場合、デフォルトの RestTemplate
(SimpleClientHttpRequestFactory
を使用)がインスタンス化されます。
一部の JVM 実装では、 例: このメソッドの非標準的な実装では、指定されたタイムアウトを無視する場合があります。 特定のニーズがある場合は、タイムアウトをテストする必要があります。 |
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 アドレスに接続できます。 |