From 55c4dec360ee6ef41331571821c891c694aa318c Mon Sep 17 00:00:00 2001 From: James Baiera Date: Tue, 14 Jul 2020 13:34:53 -0400 Subject: [PATCH] LLRC RequestOptions add RequestConfig (#57972) (#59344) Different kinds of requests may need different request options from the client default. Users can optionally set RequestConfig on a single request's RequestOptions to override the default. Without this, socketTimeout can only set at RestClient initialization. Co-authored-by: weizijun --- .../elasticsearch/client/RequestOptions.java | 31 +++++++++++++++++-- .../org/elasticsearch/client/RestClient.java | 8 +++++ .../client/RequestOptionsTests.java | 21 +++++++++++++ .../RestClientDocumentation.java | 11 +++++++ .../low-level/configuration.asciidoc | 7 +++++ 5 files changed, 75 insertions(+), 3 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/RequestOptions.java b/client/rest/src/main/java/org/elasticsearch/client/RequestOptions.java index 43a2a376326..6e44c219cd0 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RequestOptions.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RequestOptions.java @@ -20,6 +20,7 @@ package org.elasticsearch.client; import org.apache.http.Header; +import org.apache.http.client.config.RequestConfig; import org.apache.http.message.BasicHeader; import org.apache.http.nio.protocol.HttpAsyncResponseConsumer; import org.elasticsearch.client.HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory; @@ -38,23 +39,25 @@ public final class RequestOptions { * Default request options. */ public static final RequestOptions DEFAULT = new Builder( - Collections.emptyList(), HeapBufferedResponseConsumerFactory.DEFAULT, null).build(); + Collections.emptyList(), HeapBufferedResponseConsumerFactory.DEFAULT, null, null).build(); private final List
headers; private final HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory; private final WarningsHandler warningsHandler; + private final RequestConfig requestConfig; private RequestOptions(Builder builder) { this.headers = Collections.unmodifiableList(new ArrayList<>(builder.headers)); this.httpAsyncResponseConsumerFactory = builder.httpAsyncResponseConsumerFactory; this.warningsHandler = builder.warningsHandler; + this.requestConfig = builder.requestConfig; } /** * Create a builder that contains these options but can be modified. */ public Builder toBuilder() { - return new Builder(headers, httpAsyncResponseConsumerFactory, warningsHandler); + return new Builder(headers, httpAsyncResponseConsumerFactory, warningsHandler, requestConfig); } /** @@ -95,6 +98,15 @@ public final class RequestOptions { return warningsHandler; } + /** + * get RequestConfig, which can set socketTimeout, connectTimeout + * and so on by request + * @return RequestConfig + */ + public RequestConfig getRequestConfig() { + return requestConfig; + } + @Override public String toString() { StringBuilder b = new StringBuilder(); @@ -152,12 +164,14 @@ public final class RequestOptions { private final List
headers; private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory; private WarningsHandler warningsHandler; + private RequestConfig requestConfig; private Builder(List
headers, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, - WarningsHandler warningsHandler) { + WarningsHandler warningsHandler, RequestConfig requestConfig) { this.headers = new ArrayList<>(headers); this.httpAsyncResponseConsumerFactory = httpAsyncResponseConsumerFactory; this.warningsHandler = warningsHandler; + this.requestConfig = requestConfig; } /** @@ -208,6 +222,17 @@ public final class RequestOptions { public void setWarningsHandler(WarningsHandler warningsHandler) { this.warningsHandler = warningsHandler; } + + /** + * set RequestConfig, which can set socketTimeout, connectTimeout + * and so on by request + * @param requestConfig http client RequestConfig + * @return Builder + */ + public Builder setRequestConfig(RequestConfig requestConfig) { + this.requestConfig = requestConfig; + return this; + } } /** diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index 787d6549558..45e29054080 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -29,6 +29,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.AuthCache; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.GzipDecompressingEntity; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpOptions; @@ -710,6 +711,7 @@ public class RestClient implements Closeable { this.httpRequest = createHttpRequest(request.getMethod(), uri, request.getEntity()); this.cancellable = Cancellable.fromRequest(httpRequest); setHeaders(httpRequest, request.getOptions().getHeaders()); + setRequestConfig(httpRequest, request.getOptions().getRequestConfig()); this.warningsHandler = request.getOptions().getWarningsHandler() == null ? RestClient.this.warningsHandler : request.getOptions().getWarningsHandler(); } @@ -728,6 +730,12 @@ public class RestClient implements Closeable { } } + private void setRequestConfig(HttpRequestBase httpRequest, RequestConfig requestConfig) { + if (requestConfig != null) { + httpRequest.setConfig(requestConfig); + } + } + RequestContext createContextForNextAttempt(Node node, AuthCache authCache) { this.httpRequest.reset(); return new RequestContext(this, node, authCache); diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestOptionsTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestOptionsTests.java index b5418ef08a5..e97c22dd55a 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RequestOptionsTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestOptionsTests.java @@ -20,6 +20,7 @@ package org.elasticsearch.client; import org.apache.http.Header; +import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory; import java.util.ArrayList; @@ -90,6 +91,22 @@ public class RequestOptionsTests extends RestClientTestCase { assertSame(factory, options.getHttpAsyncResponseConsumerFactory()); } + public void testSetRequestBuilder() { + RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); + + RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); + int socketTimeout = 10000; + int connectTimeout = 100; + requestConfigBuilder.setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout); + RequestConfig requestConfig = requestConfigBuilder.build(); + + builder.setRequestConfig(requestConfig); + RequestOptions options = builder.build(); + assertSame(options.getRequestConfig(), requestConfig); + assertEquals(options.getRequestConfig().getSocketTimeout(), socketTimeout); + assertEquals(options.getRequestConfig().getConnectTimeout(), connectTimeout); + } + public void testEqualsAndHashCode() { RequestOptions request = randomBuilder().build(); assertEquals(request, request); @@ -122,6 +139,10 @@ public class RequestOptionsTests extends RestClientTestCase { builder.setWarningsHandler(randomBoolean() ? WarningsHandler.STRICT : WarningsHandler.PERMISSIVE); } + if (randomBoolean()) { + builder.setRequestConfig(RequestConfig.custom().build()); + } + return builder; } diff --git a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java index ba19b21f1b0..11c81d2ae24 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java +++ b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java @@ -327,6 +327,17 @@ public class RestClientDocumentation { }); //end::rest-client-config-timeouts } + { + //tag::rest-client-config-request-options-timeouts + RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(5000) + .setSocketTimeout(60000) + .build(); + RequestOptions options = RequestOptions.DEFAULT.toBuilder() + .setRequestConfig(requestConfig) + .build(); + //end::rest-client-config-request-options-timeouts + } { //tag::rest-client-config-threads RestClientBuilder builder = RestClient.builder( diff --git a/docs/java-rest/low-level/configuration.asciidoc b/docs/java-rest/low-level/configuration.asciidoc index b67f00112a8..48c47107f5b 100644 --- a/docs/java-rest/low-level/configuration.asciidoc +++ b/docs/java-rest/low-level/configuration.asciidoc @@ -25,6 +25,13 @@ seconds). include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-timeouts] -------------------------------------------------- +timeouts also can set by RequestOptions per request.this will override RestClient customizeRequestConfig. + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-config-request-options-timeouts] +-------------------------------------------------- + === Number of threads The Apache Http Async Client starts by default one dispatcher thread, and a