web-dev-qa-db-ja.com

スプリングレストテンプレートreadTimeOut

RestTemplateで利用可能なreadTimeoutを理解しようとしていますが、正確には何ですか?

これは、タイムアウト例外が発生するまでに要求にかかる合計時間ですか?

7
Seb

次のように、RestTemplateに読み取りタイムアウトを定義できます。

HttpComponentsClientHttpRequestFactory clientRequestFactory = new HttpComponentsClientHttpRequestFactory();
// set the read timeout, this value is in milliseconds
clientRequestFactory.setReadTimeout(500);

RestTemplate restTemplate = new RestTemplate(clientRequestFactory);

[〜#〜] x [〜#〜]ミリ秒のreadTimeoutが指定されている場合、そのRestTemplateインスタンスを介して行われるリクエストは[〜#〜] x [〜#〜]より長くかかりますミリ秒の場合、ResourceAccessExceptionが発生し、Java.net.SocketTimeoutExceptionが「読み取りタイムアウト」という例外メッセージでラップされます。

タイムアウトは実際には、HttpClientによってラップされているRestTemplateインスタンス内のソケットコネクタによって実装されているため、リクエストが最初にソケットに到達したときにクロックが開始し、いずれかが最初に来たときに停止します。リクエストが完了するか、readTimeoutに到達します。

つまり、設定されたreadTimeoutよりも時間がかかる要求は、タイムアウト例外で失敗します。

12
glytching

私が知る限り、restTemplateには3種類のタイムアウトがあります

  1. ConnectionRequestTimeout。これは、connectionManagerから接続を取得するためのミリ秒単位のタイムアウトです

  2. ConnectionTimeout。これは、ソースと宛先の間の接続を確立するためのミリ秒単位のタイムアウトです

  3. ReadTimeout。これはミリ秒単位のタイムアウトで、宛先エンドポイントから応答/結果が返されることを期待しています。

26
Dhana

Beanを定義することもできます。

@Bean
public RestTemplate restTemplateReadTimeout(RestTemplateBuilder builder) {
    return builder
            .setReadTimeout(15000) //15 seconds
            .build();
}

そしてそれを使う:

@Autowired
@Qualifier("restTemplateReadTimeout")
private RestTemplate restTemplate;

PS .:この構成をSpring Bootで使用したとき、異なるタイムアウト構成で異なるRestTemplate Beanを作成しようとしました。しかし、私は最終的に、Springがalwaysタイムアウト構成を1つだけ使用していることを確認しました(おそらく、最後に登録されたBeanからのタイムアウトを使用します)。ですから、注意してください。設定、バグ、または予期された動作に間違いがあったかどうかはわかりません。

8
Dherik