@Override public void execute(Runnable task) { execute(1, task); }
@Override public void execute(Runnable task) { execute(1, task); }
@Override protected void doExecute(Runnable task) { limiterForKey(taskKey, (l) -> l.execute(permits, task)); } }
@Override protected void doExecute(Runnable task) { limiterForKey(taskKey, (l) -> l.execute(permits, task)); } }
/** * Provide a task to be run with a given thread key. * <p> * See also: {@link SubmitterExecutor#execute(Runnable)} and * {@link RateLimiterExecutor#execute(double, Runnable)}. * * @param permits resource permits for this task * @param taskKey object key where {@code equals()} will be used to determine execution thread * @param task Task to be executed * @return Time in milliseconds task was delayed to maintain rate, or {@code -1} if rejected but handler did not throw */ public long execute(double permits, Object taskKey, Runnable task) { return limiterForKey(taskKey, (l) -> l.execute(permits, task)); }
/** * Provide a task to be run with a given thread key. * <p> * See also: {@link SubmitterExecutor#execute(Runnable)} and * {@link RateLimiterExecutor#execute(double, Runnable)}. * * @param permits resource permits for this task * @param taskKey object key where {@code equals()} will be used to determine execution thread * @param task Task to be executed * @return Time in milliseconds task was delayed to maintain rate, or {@code -1} if rejected but handler did not throw */ public long execute(double permits, Object taskKey, Runnable task) { return limiterForKey(taskKey, (l) -> l.execute(permits, task)); }
@Test public void executeWithPermitsFail() { try { limiter.execute(-1, DoNothingRunnable.instance()); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } try { limiter.execute(1, null); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } }
@Test public void executeWithPermitsReturnedDelayTest() { long firstDelay = limiter.execute(10, DoNothingRunnable.instance()); assertEquals(0, firstDelay); long secondDelay = limiter.execute(1, DoNothingRunnable.instance()); // should be incremented from first delay assertTrue(secondDelay > 8000); }
@Test public void getCurrentMinimumDelayTest() { assertEquals(0, limiter.getMinimumDelay()); limiter.execute(10, DoNothingRunnable.instance()); int delay = limiter.getMinimumDelay(); assertEquals(10000, delay, 1000); limiter.execute(10, DoNothingRunnable.instance()); delay = limiter.getMinimumDelay(); assertEquals(20000, delay, 1000); }
@Test public void getFutureTillDelayTest() { // verify that an empty limiter returns a finished future ListenableFuture<?> f = limiter.getFutureTillDelay(0); assertTrue(f.isDone()); // verify a it works if the limiter has waiting tasks limiter.execute(1, DoNothingRunnable.instance()); f = limiter.getFutureTillDelay(0); assertFalse(f.isDone()); scheduler.advance(1000); assertTrue(f.isDone()); }