From fe422e943eebc76e7592fa20e89b8f94f4d1fe48 Mon Sep 17 00:00:00 2001 From: Eduardo Bohrer Date: Mon, 10 Apr 2017 20:07:11 -0300 Subject: [PATCH 1/2] Set maxQps on OKHttp dispatcher to not be limited to the default configuration --- src/main/java/com/google/maps/OkHttpRequestHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/maps/OkHttpRequestHandler.java b/src/main/java/com/google/maps/OkHttpRequestHandler.java index 49fbd295f..cd6fcf263 100644 --- a/src/main/java/com/google/maps/OkHttpRequestHandler.java +++ b/src/main/java/com/google/maps/OkHttpRequestHandler.java @@ -42,10 +42,12 @@ public class OkHttpRequestHandler implements GeoApiContext.RequestHandler { private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); private final OkHttpClient client = new OkHttpClient(); private final RateLimitExecutorService rateLimitExecutorService; + private final Dispatcher dispatcher; public OkHttpRequestHandler() { rateLimitExecutorService = new RateLimitExecutorService(); - client.setDispatcher(new Dispatcher(rateLimitExecutorService)); + dispatcher = new Dispatcher(rateLimitExecutorService); + client.setDispatcher(dispatcher); } @Override @@ -95,11 +97,15 @@ public void setWriteTimeout(long timeout, TimeUnit unit) { @Override public void setQueriesPerSecond(int maxQps) { + dispatcher.setMaxRequests(maxQps); + dispatcher.setMaxRequestsPerHost(maxQps); rateLimitExecutorService.setQueriesPerSecond(maxQps); } @Override public void setQueriesPerSecond(int maxQps, int minimumInterval) { + dispatcher.setMaxRequests(maxQps); + dispatcher.setMaxRequestsPerHost(maxQps); rateLimitExecutorService.setQueriesPerSecond(maxQps, minimumInterval); } From da59848d4609d9f771529d98dccdcf2d663faa5c Mon Sep 17 00:00:00 2001 From: Eduardo Bohrer Date: Mon, 10 Apr 2017 20:07:26 -0300 Subject: [PATCH 2/2] Change delegate workQueue to achieve better performance between calls --- .../com/google/maps/internal/RateLimitExecutorService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/maps/internal/RateLimitExecutorService.java b/src/main/java/com/google/maps/internal/RateLimitExecutorService.java index edf2e1c9e..795baeea1 100644 --- a/src/main/java/com/google/maps/internal/RateLimitExecutorService.java +++ b/src/main/java/com/google/maps/internal/RateLimitExecutorService.java @@ -27,6 +27,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -47,7 +48,7 @@ public class RateLimitExecutorService implements ExecutorService, Runnable { // killed when the app exits. For synchronous requests this is ideal but it means any async // requests still pending after termination will be killed. private final ExecutorService delegate = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Integer.MAX_VALUE, 60, - TimeUnit.SECONDS, new LinkedBlockingQueue(), + TimeUnit.SECONDS, new SynchronousQueue(), threadFactory("Rate Limited Dispatcher", true)); private final BlockingQueue queue = new LinkedBlockingQueue();