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); } 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();