web-dev-qa-db-ja.com

Spring Bootアプリケーション-すべてのREST APIエンドポイントのデフォルトタイムアウトまたはすべてのエンドポイントタイムアウトを制御する簡単な構成

現在のSpringブートバージョン(1.4.x)を使用しており、API呼び出しのデフォルトのタイムアウトがあるかどうか疑問に思っています。ブレークポイントを設定してテストしましたが、待機し続け、タイムアウトしませんでした。また、注釈またはyml設定を使用して、すべてのスプリングブートアプリの既定のタイムアウトを構成しようとしていました。

いくつかの選択肢(そのうちの1つ ここ )を見つけましたが、実際にxml beanで何かを設定することが最新のスプリングブートアプリケーションでは時代遅れである追加の非ビジネスロジックコードを実際に追加するcallableを使用しています。

6
Gunjan Kumar

私は上記のすべてのオプションに同意し、私のスプリングブートアプリケーションで以下のオプションを試しました。今では完璧に動作します。以下は、Beanとしてのコードサンプルです。あとは@AutowireRestTemplate wherever(Java class) それが必要。

   @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);

        return restTemplate;
    }
4
Gunjan Kumar

あなたが試すことができます server.connection-timeout=5000はapplication.propertiesにあります。 公式ドキュメント から:

server.connection-timeout =#コネクターが接続を閉じる前に別のHTTP要求を待機する時間(ミリ秒)。設定されていない場合、コネクタのコンテナ固有のデフォルトが使用されます。 -1の値を使用して、タイムアウトがない(つまり無限)ことを示します。

更新:マイクロサービスアーキテクチャを使用していることに気づいたので、マイクロサービス間で通信するときにタイムアウトを処理する必要がある場合は、サーバー側ではなくクライアント側で処理することをお勧めします。 呼び出しようとしているマイクロサービスが過負荷になり、そのパフォーマンスがユーザーエクスペリエンスに大きく影響するレベルまで低下する場合、リクエストをドロップするよりもフォールバックデータを返す方が良い場合があります。

マイクロサービスアーキテクチャを備えた電子商取引Webサイトがあり、ユーザーに推奨事項を提供するマイクロサービスの1つが非常に遅くなると想像してください。この場合、5xxエラーページを顧客に表示するのではなく、今月の人気製品のトップ10になる可能性のあるフォールバックデータを返すことをお勧めします。さらに、後続のリクエストがタイムアウトで失敗した場合、リクエストを「推奨サービス」に送信せず、フォールバックデータをすぐに返すという決定を下すことができます。しばらくしてから、「recommendation-service」にリクエストを再度送信してみてください。リクエストが正常になったら、フォールバックデータの代わりにリクエストを使用してください。

これはCircuit Breakerパターンと呼ばれ、Hystrixと呼ばれるフレームワークに既に実装されています。これを詳細に説明した素晴らしい記事があります: http://www.baeldung.com/spring-cloud-netflix-hystrix 。 Spring Cloud Feign + Spring Cloud Hystrixは、特にすぐに使えるディスカバリサービス(Spring Cloud Eurekaなど)と連携していることを考慮すると、本当に素敵に見えます。

7
Danylo Zatorsky

これを行うには、いくつかの方法があります。

1)ClientHttpRequestFactoryRestTemplateとともに使用する:

public RestTemplate restTemplate() {
    return new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setReadTimeout(timeinMillis);
    factory.setConnectTimeout(timeinMillis);
    return factory;
}

2)2番目の方法はcallableを使用することですが、既にそのソリューションを検討していると思います。

3
tryingToLearn

タイムアウトは、TomcatのconnectionTimeoutプロパティを使用して設定できます。

Tomcat用に設定する方法については、この回答を参照してください。

Spring Boot組み込みTomcatでのmaxKeepAliveRequestsの構成

0
zeagord