Spring Boot RESTサービスがあり、リクエストの一部としてサードパーティのサービスを呼び出すことがあります。すべてのリソースにタイムアウト(たとえば5秒)を設定したいので、リクエストの処理(受信から応答までのチェーン全体)には、コントローラーが実際の応答ではなくHTTP 503で応答する5秒以上かかります。
spring.mvc.async.request-timeout=5000
しかし、私はそれで運がなかった。また、WebMvcConfigurationSupportを拡張し、configureAsyncSupportをオーバーライドしようとしました。
@Override
public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(5000);
configurer.registerCallableInterceptors(timeoutInterceptor());
}
@Bean
public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
return new TimeoutCallableProcessingInterceptor();
}
運もなく。
私はすべてのサードパーティコールを手動で時間調整する必要があり、時間がかかりすぎる場合はタイムアウト例外をスローします。そうですか?または、すべてのリクエストエンドポイントをカバーする簡単で包括的なソリューションはありますか?
Callable<>
を機能させるには、spring.mvc.async.request-timeout=5000
を返す必要があります。
@RequestMapping(method = RequestMethod.GET)
public Callable<String> getFoobar() throws InterruptedException {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(8000); //this will cause a timeout
return "foobar";
}
};
}
@Transactionalアノテーションは、@ RestControllerの特定のメソッドのタイムアウトを秒単位で指定できるタイムアウトパラメーターを取ります
@RequestMapping(value = "/method",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
@Transactional(timeout = 120)
あなたが試すことができます server.connection-timeout=5000
はapplication.propertiesにあります。 公式ドキュメント から:
server.connection-timeout =#コネクターが接続を閉じる前に別のHTTP要求を待機する時間(ミリ秒)。設定されていない場合、コネクタのコンテナ固有のデフォルトが使用されます。 -1の値を使用して、タイムアウトがない(つまり無限)ことを示します。
一方、ここでの回答ですでに説明したように、サーキットブレーカーパターンを使用してクライアント側でタイムアウトを処理することもできます。 https://stackoverflow.com/a/44484579/2328781
restTemplateを使用している場合は、次のコードを使用してタイムアウトを実装する必要があります
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(2000);
factory.setConnectTimeout(2000);
return factory;
}}
XML設定
<bean class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"
p:readTimeout="2000"
p:connectTimeout="2000" />
</constructor-arg>
Spring Cloud Netflix Hystrixスターターを見て、信頼できない/遅いリモート呼び出しを処理することをお勧めします。これは、まさにこのようなことを目的としたサーキットブレーカーパターンを実装しています。
詳細については公式ドキュメント を参照してください。