@Override
    public Optional<Listener> acquire(ContextT context) {
        return tryAcquire(context).map(delegate -> new Listener() {
            @Override
            public void onSuccess() {
                delegate.onSuccess();
                unblock();
            }

            @Override
            public void onIgnore() {
                delegate.onIgnore();
                unblock();
            }

            @Override
            public void onDropped() {
                delegate.onDropped();
                unblock();
            }
        });
    }
@Test
    public void rejectWhenBacklogSizeReached() throws InterruptedException {
        acquireNAsync(blockingLimiter, 14);

        // Small delay to make sure all acquire() calls have been made
        TimeUnit.MILLISECONDS.sleep(250);

        // Next acquire will reject with no delay
        long start = System.nanoTime();
        Optional<Limiter.Listener> listener = blockingLimiter.acquire(null);
        long duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
        Assert.assertTrue("Duration = " + duration, duration < 100);
        Assert.assertFalse(listener.isPresent());
    }