Skip to content

Commit f1510f8

Browse files
committed
Merge pull request #15965 from nosan
* pr/15965: Polish "Allow to configure the Elasticsearch rest client timeouts" Allow to configure the Elasticsearch rest client timeouts
2 parents af4ce2d + 2cfcd26 commit f1510f8

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.elasticsearch.rest;
1818

19+
import java.time.Duration;
20+
1921
import org.apache.http.HttpHost;
2022
import org.apache.http.auth.AuthScope;
2123
import org.apache.http.auth.Credentials;
@@ -68,6 +70,14 @@ public RestClientBuilder restClientBuilder(RestClientProperties properties,
6870
builder.setHttpClientConfigCallback((httpClientBuilder) -> httpClientBuilder
6971
.setDefaultCredentialsProvider(credentialsProvider));
7072
});
73+
builder.setRequestConfigCallback((requestConfigBuilder) -> {
74+
map.from(properties::getConnectionTimeout).whenNonNull()
75+
.as(Duration::toMillis).asInt(Math::toIntExact)
76+
.to(requestConfigBuilder::setConnectTimeout);
77+
map.from(properties::getReadTimeout).whenNonNull().as(Duration::toMillis)
78+
.asInt(Math::toIntExact).to(requestConfigBuilder::setSocketTimeout);
79+
return requestConfigBuilder;
80+
});
7181
builderCustomizers.orderedStream()
7282
.forEach((customizer) -> customizer.customize(builder));
7383
return builder;

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientProperties.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2018 the original author or authors.
2+
* Copyright 2012-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.elasticsearch.rest;
1818

19+
import java.time.Duration;
1920
import java.util.ArrayList;
2021
import java.util.Collections;
2122
import java.util.List;
@@ -47,6 +48,16 @@ public class RestClientProperties {
4748
*/
4849
private String password;
4950

51+
/**
52+
* Connection timeout.
53+
*/
54+
private Duration connectionTimeout = Duration.ofSeconds(1);
55+
56+
/**
57+
* Read timeout.
58+
*/
59+
private Duration readTimeout = Duration.ofSeconds(30);
60+
5061
public List<String> getUris() {
5162
return this.uris;
5263
}
@@ -71,4 +82,20 @@ public void setPassword(String password) {
7182
this.password = password;
7283
}
7384

85+
public Duration getConnectionTimeout() {
86+
return this.connectionTimeout;
87+
}
88+
89+
public void setConnectionTimeout(Duration connectionTimeout) {
90+
this.connectionTimeout = connectionTimeout;
91+
}
92+
93+
public Duration getReadTimeout() {
94+
return this.readTimeout;
95+
}
96+
97+
public void setReadTimeout(Duration readTimeout) {
98+
this.readTimeout = readTimeout;
99+
}
100+
74101
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfigurationTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package org.springframework.boot.autoconfigure.elasticsearch.rest;
1818

19+
import java.time.Duration;
1920
import java.util.HashMap;
2021
import java.util.Map;
2122

2223
import org.elasticsearch.action.get.GetRequest;
2324
import org.elasticsearch.action.index.IndexRequest;
2425
import org.elasticsearch.client.RequestOptions;
2526
import org.elasticsearch.client.RestClient;
27+
import org.elasticsearch.client.RestClientBuilder;
2628
import org.elasticsearch.client.RestHighLevelClient;
2729
import org.junit.ClassRule;
2830
import org.junit.Test;
@@ -32,6 +34,7 @@
3234
import org.springframework.boot.testsupport.testcontainers.ElasticsearchContainer;
3335
import org.springframework.context.annotation.Bean;
3436
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.test.util.ReflectionTestUtils;
3538

3639
import static org.assertj.core.api.Assertions.assertThat;
3740
import static org.mockito.Mockito.mock;
@@ -74,6 +77,40 @@ public void configureWhenBuilderCustomizerShouldApply() {
7477
});
7578
}
7679

80+
@Test
81+
public void configureWithNoTimeoutsApplyDefaults() {
82+
this.contextRunner.run((context) -> {
83+
assertThat(context).hasSingleBean(RestClient.class);
84+
RestClient restClient = context.getBean(RestClient.class);
85+
assertTimeouts(restClient,
86+
Duration.ofMillis(RestClientBuilder.DEFAULT_CONNECT_TIMEOUT_MILLIS),
87+
Duration.ofMillis(RestClientBuilder.DEFAULT_SOCKET_TIMEOUT_MILLIS));
88+
});
89+
}
90+
91+
@Test
92+
public void configureWithCustomTimeouts() {
93+
this.contextRunner
94+
.withPropertyValues("spring.elasticsearch.rest.connection-timeout=15s",
95+
"spring.elasticsearch.rest.read-timeout=1m")
96+
.run((context) -> {
97+
assertThat(context).hasSingleBean(RestClient.class);
98+
RestClient restClient = context.getBean(RestClient.class);
99+
assertTimeouts(restClient, Duration.ofSeconds(15),
100+
Duration.ofMinutes(1));
101+
});
102+
}
103+
104+
private static void assertTimeouts(RestClient restClient, Duration connectTimeout,
105+
Duration readTimeout) {
106+
Object client = ReflectionTestUtils.getField(restClient, "client");
107+
Object config = ReflectionTestUtils.getField(client, "defaultConfig");
108+
assertThat(config).hasFieldOrPropertyWithValue("socketTimeout",
109+
Math.toIntExact(readTimeout.toMillis()));
110+
assertThat(config).hasFieldOrPropertyWithValue("connectTimeout",
111+
Math.toIntExact(connectTimeout.toMillis()));
112+
}
113+
77114
@Test
78115
public void restClientCanQueryElasticsearchNode() {
79116
this.contextRunner

spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4805,6 +4805,7 @@ You can further tune how `RestClient` is configured, as shown in the following e
48054805
[source,properties,indent=0]
48064806
----
48074807
spring.elasticsearch.rest.uris=https://search.example.com:9200
4808+
spring.elasticsearch.rest.read-timeout=10s
48084809
spring.elasticsearch.rest.username=user
48094810
spring.elasticsearch.rest.password=secret
48104811
----

0 commit comments

Comments
 (0)