現在のSpringブートバージョン(1.4.x)を使用しており、API呼び出しのデフォルトのタイムアウトがあるかどうか疑問に思っています。ブレークポイントを設定してテストしましたが、待機し続け、タイムアウトしませんでした。また、注釈またはyml設定を使用して、すべてのスプリングブートアプリの既定のタイムアウトを構成しようとしていました。
いくつかの選択肢(そのうちの1つ ここ )を見つけましたが、実際にxml beanで何かを設定することが最新のスプリングブートアプリケーションでは時代遅れである追加の非ビジネスロジックコードを実際に追加するcallableを使用しています。
私は上記のすべてのオプションに同意し、私のスプリングブートアプリケーションで以下のオプションを試しました。今では完璧に動作します。以下は、Beanとしてのコードサンプルです。あとは@Autowire
RestTemplate
wherever(Java class
) それが必要。
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);
return restTemplate;
}
あなたが試すことができます 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など)と連携していることを考慮すると、本当に素敵に見えます。
これを行うには、いくつかの方法があります。
1)ClientHttpRequestFactory
をRestTemplate
とともに使用する:
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を使用することですが、既にそのソリューションを検討していると思います。
タイムアウトは、TomcatのconnectionTimeout
プロパティを使用して設定できます。
Tomcat用に設定する方法については、この回答を参照してください。