@Override public SubmitterScheduler makeSubmitterScheduler(int poolSize, boolean prestartIfAvailable) { /* we must honor pool size of one due to how scheduled tasks are handled. Since an extra * task is used for scheduled tasks, execution order may switch if there is more than one * thread. */ SchedulerService scheduler = schedulerFactory.makeSchedulerService(poolSize > 1 ? poolSize * 2 : 1, prestartIfAvailable); return new KeyedSchedulerServiceLimiter(scheduler, poolSize).getSubmitterSchedulerForKey("foo"); }
@Test public void removeRunnableTest() { KeyedSchedulerServiceLimiter limiter = makeLimiter(1); String key = StringUtils.makeRandomString(5); BlockingTestRunnable btr = new BlockingTestRunnable(); try { assertFalse(limiter.remove(btr)); assertFalse(limiter.remove((Runnable)null)); limiter.execute(key, btr); TestRunnable tr = new TestRunnable(); assertFalse(limiter.remove(tr)); limiter.execute(key, tr); assertTrue(limiter.remove(tr)); assertFalse(limiter.remove(tr)); limiter.submit(key, tr); assertTrue(limiter.remove(tr)); assertFalse(limiter.remove(tr)); } finally { btr.unblock(); } }
@Test public void getQueuedTaskCountTest() { // must be single thread scheduler so we can block one on the shceduler KeyedSchedulerServiceLimiter limiter = new KeyedSchedulerServiceLimiter(new SingleThreadScheduler(), 1); String key = StringUtils.makeRandomString(5); BlockingTestRunnable btr = new BlockingTestRunnable(); try { assertEquals(0, limiter.getQueuedTaskCount()); limiter.execute(key, btr); btr.blockTillStarted(); limiter.execute(StringUtils.makeRandomString(2), DoNothingRunnable.instance()); // 1 blocked on scheduler due to different key assertEquals(1, limiter.getQueuedTaskCount()); limiter.execute(key, DoNothingRunnable.instance()); // 1 additional blocked in limiter now assertEquals(2, limiter.getQueuedTaskCount()); } finally { btr.unblock(); } }
@Override protected SchedulerServiceLimiter makeLimiter(String limiterThreadName) { return new SchedulerServiceLimiter(StringUtils.isNullOrEmpty(limiterThreadName) ? scheduler : new ThreadRenamingSchedulerService(scheduler, limiterThreadName, false), getMaxConcurrencyPerKey(), limitFutureListenersExecution); }
@Test public void getActiveTaskCountTest() { KeyedSchedulerServiceLimiter limiter = makeLimiter(1); String key = StringUtils.makeRandomString(5); assertEquals(0, limiter.getActiveTaskCount()); BlockingTestRunnable btr = new BlockingTestRunnable(); try { limiter.execute(key, btr); btr.blockTillStarted(); assertEquals(1, limiter.getActiveTaskCount()); } finally { btr.unblock(); } }
@Override protected KeyedSchedulerServiceLimiter makeLimiter(int limit) { return new KeyedSchedulerServiceLimiter(scheduler, limit, null, true, true); }
@Test public void isShutdownTest() { KeyedSchedulerServiceLimiter limiter = makeLimiter(1); assertFalse(limiter.isShutdown()); scheduler.shutdown(); assertTrue(limiter.isShutdown()); } }
@Test public void removeCallableTest() { KeyedSchedulerServiceLimiter limiter = makeLimiter(1); String key = StringUtils.makeRandomString(5); BlockingTestRunnable btr = new BlockingTestRunnable(); try { assertFalse(limiter.remove(btr)); assertFalse(limiter.remove((Runnable)null)); limiter.execute(key, btr); TestCallable tc = new TestCallable(); assertFalse(limiter.remove(tc)); limiter.submit(key, tc); assertTrue(limiter.remove(tc)); assertFalse(limiter.remove(tc)); } finally { btr.unblock(); } }
@Override protected SchedulerServiceLimiter makeLimiter(String limiterThreadName) { return new SchedulerServiceLimiter(StringUtils.isNullOrEmpty(limiterThreadName) ? scheduler : new ThreadRenamingSchedulerService(scheduler, limiterThreadName, false), getMaxConcurrencyPerKey(), limitFutureListenersExecution); }
@Test @SuppressWarnings("unused") public void constructorFail() { try { new KeyedSchedulerServiceLimiter(null, 10); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } try { new KeyedSchedulerServiceLimiter(scheduler, 0); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } }