private Request addRateLimitIdTag(Request request) { return request.newBuilder() .tag(ConcurrencyLimiterListener.class, ConcurrencyLimiterListener.of(SettableFuture.create())) .build(); } }
@Override public void enqueue(Callback callback) { ListenableFuture<Limiter.Listener> limiterListener = limiter.acquire(); request().tag(ConcurrencyLimiterListener.class).limiterListener().setFuture(limiterListener); Futures.addCallback(limiterListener, new FutureCallback<Limiter.Listener>() { @Override public void onSuccess(Limiter.Listener listener) { enqueueInternal(callback); } @Override public void onFailure(Throwable throwable) { callback.onFailure( RemotingOkHttpCall.this, new IOException(new AssertionError("This should never happen, since it implies " + "we failed when using the concurrency limiter", throwable))); } }, MoreExecutors.directExecutor()); }
@Override public void enqueue(Callback callback) { ListenableFuture<Limiter.Listener> limiterListener = limiter.acquire(); request().tag(ConcurrencyLimiterListener.class).limiterListener().setFuture(limiterListener); Futures.addCallback(limiterListener, new FutureCallback<Limiter.Listener>() { @Override public void onSuccess(Limiter.Listener listener) { enqueueInternal(callback); } @Override public void onFailure(Throwable throwable) { callback.onFailure( RemotingOkHttpCall.this, new IOException(new AssertionError("This should never happen, since it implies " + "we failed when using the concurrency limiter", throwable))); } }, MoreExecutors.directExecutor()); }
private Request addRateLimitIdTag(Request request) { return request.newBuilder() .tag(ConcurrencyLimiterListener.class, ConcurrencyLimiterListener.of(SettableFuture.create())) .build(); } }
@Override public Response intercept(Chain chain) throws IOException { ConcurrencyLimiterListener limiterListenerTag = chain.request().tag(ConcurrencyLimiterListener.class); if (limiterListenerTag == null) { return chain.proceed(chain.request()); } ListenableFuture<Limiter.Listener> limiterFuture = limiterListenerTag.limiterListener(); Preconditions.checkState(limiterFuture.isDone(), "Limit listener future should have been fulfilled."); Limiter.Listener listener = Futures.getUnchecked(limiterFuture); try { Response response = chain.proceed(chain.request()); if (DROPPED_CODES.contains(response.code())) { listener.onDropped(); return response; } else if (!response.isSuccessful() || response.isRedirect()) { listener.onIgnore(); return response; } else { return wrapResponse(listener, response); } } catch (IOException e) { listener.onIgnore(); throw e; } }
@Before public void before() { SettableFuture<Limiter.Listener> listenerFuture = SettableFuture.create(); listenerFuture.set(listener); request = new Request.Builder() .url("https://localhost:1234/call") .tag(ConcurrencyLimiterListener.class, ConcurrencyLimiterListener.of(listenerFuture)) .get() .build(); response = new Response.Builder() .code(200) .request(request) .message("message") .protocol(Protocol.HTTP_2) .build(); when(chain.request()).thenReturn(request); }
@Override public Response intercept(Chain chain) throws IOException { ConcurrencyLimiterListener limiterListenerTag = chain.request().tag(ConcurrencyLimiterListener.class); if (limiterListenerTag == null) { return chain.proceed(chain.request()); } ListenableFuture<Limiter.Listener> limiterFuture = limiterListenerTag.limiterListener(); Preconditions.checkState(limiterFuture.isDone(), "Limit listener future should have been fulfilled."); Limiter.Listener listener = Futures.getUnchecked(limiterFuture); try { Response response = chain.proceed(chain.request()); if (DROPPED_CODES.contains(response.code())) { listener.onDropped(); return response; } else if (!response.isSuccessful() || response.isRedirect()) { listener.onIgnore(); return response; } else { return wrapResponse(listener, response); } } catch (IOException e) { listener.onIgnore(); throw e; } }