From bd0b06440ec6831dbdf575745988043757040e81 Mon Sep 17 00:00:00 2001 From: Chris Earle Date: Thu, 25 Aug 2016 18:36:16 -0400 Subject: [PATCH] Add "Async" to the end of each Async RestClient method This makes it much harder to accidentally miss the Response. --- .../org/elasticsearch/client/RestClient.java | 80 ++++++++++--------- .../client/RestClientIntegTests.java | 2 +- .../remote/RemoteScrollableHitSource.java | 5 +- 3 files changed, 45 insertions(+), 42 deletions(-) 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 fc89af1d720..a6c3d82dd8f 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -65,16 +65,20 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; /** - * Client that connects to an elasticsearch cluster through http. + * Client that connects to an Elasticsearch cluster through HTTP. + *

* Must be created using {@link RestClientBuilder}, which allows to set all the different options or just rely on defaults. * The hosts that are part of the cluster need to be provided at creation time, but can also be replaced later * by calling {@link #setHosts(HttpHost...)}. + *

* The method {@link #performRequest(String, String, Map, HttpEntity, Header...)} allows to send a request to the cluster. When * sending a request, a host gets selected out of the provided ones in a round-robin fashion. Failing hosts are marked dead and * retried after a certain amount of time (minimum 1 minute, maximum 30 minutes), depending on how many times they previously * failed (the more failures, the later they will be retried). In case of failures all of the alive nodes (or dead nodes that * deserve a retry) are retried until one responds or none of them does, in which case an {@link IOException} will be thrown. - * + *

+ * Requests can be either synchronous or asynchronous. The asynchronous variants all end with {@code Async}. + *

* Requests can be traced by enabling trace logging for "tracer". The trace logger outputs requests and responses in curl format. */ public class RestClient implements Closeable { @@ -124,41 +128,41 @@ public class RestClient implements Closeable { } /** - * Sends a request to the elasticsearch cluster that the client points to and waits for the corresponding response + * Sends a request to the Elasticsearch cluster that the client points to and waits for the corresponding response * to be returned. Shortcut to {@link #performRequest(String, String, Map, HttpEntity, Header...)} but without parameters * and request body. * * @param method the http method * @param endpoint the path of the request (without host and port) * @param headers the optional request headers - * @return the response returned by elasticsearch + * @return the response returned by Elasticsearch * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error - * @throws ResponseException in case elasticsearch responded with a status code that indicated an error + * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error */ public Response performRequest(String method, String endpoint, Header... headers) throws IOException { return performRequest(method, endpoint, Collections.emptyMap(), (HttpEntity)null, headers); } /** - * Sends a request to the elasticsearch cluster that the client points to and waits for the corresponding response + * Sends a request to the Elasticsearch cluster that the client points to and waits for the corresponding response * to be returned. Shortcut to {@link #performRequest(String, String, Map, HttpEntity, Header...)} but without request body. * * @param method the http method * @param endpoint the path of the request (without host and port) * @param params the query_string parameters * @param headers the optional request headers - * @return the response returned by elasticsearch + * @return the response returned by Elasticsearch * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error - * @throws ResponseException in case elasticsearch responded with a status code that indicated an error + * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error */ public Response performRequest(String method, String endpoint, Map params, Header... headers) throws IOException { return performRequest(method, endpoint, params, (HttpEntity)null, headers); } /** - * Sends a request to the elasticsearch cluster that the client points to and waits for the corresponding response + * Sends a request to the Elasticsearch cluster that the client points to and waits for the corresponding response * to be returned. Shortcut to {@link #performRequest(String, String, Map, HttpEntity, HttpAsyncResponseConsumer, Header...)} * which doesn't require specifying an {@link HttpAsyncResponseConsumer} instance, {@link HeapBufferedAsyncResponseConsumer} * will be used to consume the response body. @@ -168,10 +172,10 @@ public class RestClient implements Closeable { * @param params the query_string parameters * @param entity the body of the request, null if not applicable * @param headers the optional request headers - * @return the response returned by elasticsearch + * @return the response returned by Elasticsearch * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error - * @throws ResponseException in case elasticsearch responded with a status code that indicated an error + * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error */ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, Header... headers) throws IOException { @@ -180,7 +184,7 @@ public class RestClient implements Closeable { } /** - * Sends a request to the elasticsearch cluster that the client points to. Blocks until the request is completed and returns + * Sends a request to the Elasticsearch cluster that the client points to. Blocks until the request is completed and returns * its response or fails by throwing an exception. Selects a host out of the provided ones in a round-robin fashion. Failing hosts * are marked dead and retried after a certain amount of time (minimum 1 minute, maximum 30 minutes), depending on how many times * they previously failed (the more failures, the later they will be retried). In case of failures all of the alive nodes (or dead @@ -193,37 +197,37 @@ public class RestClient implements Closeable { * @param responseConsumer the {@link HttpAsyncResponseConsumer} callback. Controls how the response * body gets streamed from a non-blocking HTTP connection on the client side. * @param headers the optional request headers - * @return the response returned by elasticsearch + * @return the response returned by Elasticsearch * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error - * @throws ResponseException in case elasticsearch responded with a status code that indicated an error + * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error */ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumer responseConsumer, Header... headers) throws IOException { SyncResponseListener listener = new SyncResponseListener(maxRetryTimeoutMillis); - performRequest(method, endpoint, params, entity, responseConsumer, listener, headers); + performRequestAsync(method, endpoint, params, entity, responseConsumer, listener, headers); return listener.get(); } /** - * Sends a request to the elasticsearch cluster that the client points to. Doesn't wait for the response, instead + * Sends a request to the Elasticsearch cluster that the client points to. Doesn't wait for the response, instead * the provided {@link ResponseListener} will be notified upon completion or failure. Shortcut to - * {@link #performRequest(String, String, Map, HttpEntity, ResponseListener, Header...)} but without parameters and request body. + * {@link #performRequestAsync(String, String, Map, HttpEntity, ResponseListener, Header...)} but without parameters and request body. * * @param method the http method * @param endpoint the path of the request (without host and port) * @param responseListener the {@link ResponseListener} to notify when the request is completed or fails * @param headers the optional request headers */ - public void performRequest(String method, String endpoint, ResponseListener responseListener, Header... headers) { - performRequest(method, endpoint, Collections.emptyMap(), null, responseListener, headers); + public void performRequestAsync(String method, String endpoint, ResponseListener responseListener, Header... headers) { + performRequestAsync(method, endpoint, Collections.emptyMap(), null, responseListener, headers); } /** - * Sends a request to the elasticsearch cluster that the client points to. Doesn't wait for the response, instead + * Sends a request to the Elasticsearch cluster that the client points to. Doesn't wait for the response, instead * the provided {@link ResponseListener} will be notified upon completion or failure. Shortcut to - * {@link #performRequest(String, String, Map, HttpEntity, ResponseListener, Header...)} but without request body. + * {@link #performRequestAsync(String, String, Map, HttpEntity, ResponseListener, Header...)} but without request body. * * @param method the http method * @param endpoint the path of the request (without host and port) @@ -231,15 +235,15 @@ public class RestClient implements Closeable { * @param responseListener the {@link ResponseListener} to notify when the request is completed or fails * @param headers the optional request headers */ - public void performRequest(String method, String endpoint, Map params, - ResponseListener responseListener, Header... headers) { - performRequest(method, endpoint, params, null, responseListener, headers); + public void performRequestAsync(String method, String endpoint, Map params, + ResponseListener responseListener, Header... headers) { + performRequestAsync(method, endpoint, params, null, responseListener, headers); } /** - * Sends a request to the elasticsearch cluster that the client points to. Doesn't wait for the response, instead + * Sends a request to the Elasticsearch cluster that the client points to. Doesn't wait for the response, instead * the provided {@link ResponseListener} will be notified upon completion or failure. - * Shortcut to {@link #performRequest(String, String, Map, HttpEntity, HttpAsyncResponseConsumer, ResponseListener, Header...)} + * Shortcut to {@link #performRequestAsync(String, String, Map, HttpEntity, HttpAsyncResponseConsumer, ResponseListener, Header...)} * which doesn't require specifying an {@link HttpAsyncResponseConsumer} instance, {@link HeapBufferedAsyncResponseConsumer} * will be used to consume the response body. * @@ -250,14 +254,14 @@ public class RestClient implements Closeable { * @param responseListener the {@link ResponseListener} to notify when the request is completed or fails * @param headers the optional request headers */ - public void performRequest(String method, String endpoint, Map params, - HttpEntity entity, ResponseListener responseListener, Header... headers) { + public void performRequestAsync(String method, String endpoint, Map params, + HttpEntity entity, ResponseListener responseListener, Header... headers) { HttpAsyncResponseConsumer responseConsumer = new HeapBufferedAsyncResponseConsumer(); - performRequest(method, endpoint, params, entity, responseConsumer, responseListener, headers); + performRequestAsync(method, endpoint, params, entity, responseConsumer, responseListener, headers); } /** - * Sends a request to the elasticsearch cluster that the client points to. The request is executed asynchronously + * Sends a request to the Elasticsearch cluster that the client points to. The request is executed asynchronously * and the provided {@link ResponseListener} gets notified upon request completion or failure. * Selects a host out of the provided ones in a round-robin fashion. Failing hosts are marked dead and retried after a certain * amount of time (minimum 1 minute, maximum 30 minutes), depending on how many times they previously failed (the more failures, @@ -273,20 +277,20 @@ public class RestClient implements Closeable { * @param responseListener the {@link ResponseListener} to notify when the request is completed or fails * @param headers the optional request headers */ - public void performRequest(String method, String endpoint, Map params, - HttpEntity entity, HttpAsyncResponseConsumer responseConsumer, - ResponseListener responseListener, Header... headers) { + public void performRequestAsync(String method, String endpoint, Map params, + HttpEntity entity, HttpAsyncResponseConsumer responseConsumer, + ResponseListener responseListener, Header... headers) { URI uri = buildUri(endpoint, params); HttpRequestBase request = createHttpRequest(method, uri, entity); setHeaders(request, headers); FailureTrackingResponseListener failureTrackingResponseListener = new FailureTrackingResponseListener(responseListener); long startTime = System.nanoTime(); - performRequest(startTime, nextHost().iterator(), request, responseConsumer, failureTrackingResponseListener); + performRequestAsync(startTime, nextHost().iterator(), request, responseConsumer, failureTrackingResponseListener); } - private void performRequest(final long startTime, final Iterator hosts, final HttpRequestBase request, - final HttpAsyncResponseConsumer responseConsumer, - final FailureTrackingResponseListener listener) { + private void performRequestAsync(final long startTime, final Iterator hosts, final HttpRequestBase request, + final HttpAsyncResponseConsumer responseConsumer, + final FailureTrackingResponseListener listener) { final HttpHost host = hosts.next(); //we stream the request body if the entity allows for it HttpAsyncRequestProducer requestProducer = HttpAsyncMethods.create(host, request); @@ -340,7 +344,7 @@ public class RestClient implements Closeable { } else { listener.trackFailure(exception); request.reset(); - performRequest(startTime, hosts, request, responseConsumer, listener); + performRequestAsync(startTime, hosts, request, responseConsumer, listener); } } else { listener.onDefinitiveFailure(exception); diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientIntegTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientIntegTests.java index 455affea9d5..79da041f379 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientIntegTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientIntegTests.java @@ -226,7 +226,7 @@ public class RestClientIntegTests extends RestClientTestCase { for (int i = 0; i < numRequests; i++) { final String method = RestClientTestUtil.randomHttpMethod(getRandom()); final int statusCode = randomStatusCode(getRandom()); - restClient.performRequest(method, "/" + statusCode, new ResponseListener() { + restClient.performRequestAsync(method, "/" + statusCode, new ResponseListener() { @Override public void onSuccess(Response response) { responses.add(new TestResponse(method, statusCode, response)); diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteScrollableHitSource.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteScrollableHitSource.java index 41f6dd5f946..572913493cf 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteScrollableHitSource.java +++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteScrollableHitSource.java @@ -98,7 +98,6 @@ public class RemoteScrollableHitSource extends ScrollableHitSource { void lookupRemoteVersion(Consumer onVersion) { execute("GET", "", emptyMap(), null, MAIN_ACTION_PARSER, onVersion); - } private void onStartResponse(Consumer onResponse, Response response) { @@ -119,7 +118,7 @@ public class RemoteScrollableHitSource extends ScrollableHitSource { @Override protected void clearScroll(String scrollId) { // Need to throw out response.... - client.performRequest("DELETE", scrollPath(), emptyMap(), scrollEntity(scrollId), new ResponseListener() { + client.performRequestAsync("DELETE", scrollPath(), emptyMap(), scrollEntity(scrollId), new ResponseListener() { @Override public void onSuccess(org.elasticsearch.client.Response response) { logger.debug("Successfully cleared [{}]", scrollId); @@ -141,7 +140,7 @@ public class RemoteScrollableHitSource extends ScrollableHitSource { @Override protected void doRun() throws Exception { - client.performRequest(method, uri, params, entity, new ResponseListener() { + client.performRequestAsync(method, uri, params, entity, new ResponseListener() { @Override public void onSuccess(org.elasticsearch.client.Response response) { // Restore the thread context to get the precious headers