@Override public ListenableFuture<?> submit(Runnable task, TaskPriority priority) { return submit(task, null, priority); }
@Override public void execute(Runnable task, TaskPriority priority) { ArgumentVerifier.assertNotNull(task, "task"); doSchedule(task, 0, priority); }
@Override public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs, TaskPriority priority) { return submitScheduled(task, null, delayInMs, priority); }
@Test public void getSetQueueLimitTest() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); assertEquals(TEST_QTY, queueRejector.getQueueLimit()); queueRejector.setQueueLimit(TEST_QTY * 2); assertEquals(TEST_QTY * 2, queueRejector.getQueueLimit()); }
private static void getQueuedTaskByPriorityCountTest(TaskPriority submitPriority) { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); for (int i = 0; i < TEST_QTY; i++) { assertEquals(TaskPriority.High == submitPriority ? i : 0, queueRejector.getQueuedTaskCount(TaskPriority.High)); assertEquals(TaskPriority.Low == submitPriority ? i : 0, queueRejector.getQueuedTaskCount(TaskPriority.Low)); assertEquals(TaskPriority.Starvable == submitPriority ? i : 0, queueRejector.getQueuedTaskCount(TaskPriority.Starvable)); queueRejector.execute(DoNothingRunnable.instance(), submitPriority); } assertEquals(TEST_QTY, testableScheduler.tick()); assertEquals(0, queueRejector.getQueuedTaskCount(submitPriority)); }
@Test public void rejectCallableTest() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); for (int i = 0; i < TEST_QTY; i++) { queueRejector.submit(new TestCallable()); } try { queueRejector.submit(new TestCallable()); fail("Exception should have thrown"); } catch (RejectedExecutionException e) { // expected } // verify the task was never added assertEquals(TEST_QTY, testableScheduler.tick()); // we should be able to add again now for (int i = 0; i < TEST_QTY; i++) { queueRejector.submit(new TestCallable()); } }
protected void doSchedule(Runnable task, long delayInMillis, TaskPriority priority) { if (dontLimitStarvable && priority == TaskPriority.Starvable) { parentScheduler.schedule(task, delayInMillis, priority); return; } while (true) { int casValue = queuedTaskCount.get(); if (casValue >= getQueueLimit()) { rejectedExecutionHandler.handleRejectedTask(task); return; // in case handler did not throw exception } else if (queuedTaskCount.compareAndSet(casValue, casValue + 1)) { try { parentScheduler.schedule(new DecrementingRunnable(task, queuedTaskCount), delayInMillis, priority); } catch (RejectedExecutionException e) { queuedTaskCount.decrementAndGet(); throw e; } break; } // else loop and retry } }
@Test @Override public void getWaitingForExecutionTaskCountTest() { super.getWaitingForExecutionTaskCountTest(); // more complete tests, we focus here on priorities TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); assertEquals(0, queueRejector.getWaitingForExecutionTaskCount()); queueRejector.execute(DoNothingRunnable.instance(), TaskPriority.Low); assertEquals(1, queueRejector.getWaitingForExecutionTaskCount()); assertEquals(0, queueRejector.getWaitingForExecutionTaskCount(TaskPriority.High)); assertEquals(1, queueRejector.getWaitingForExecutionTaskCount(TaskPriority.Low)); testableScheduler.tick(); assertEquals(0, queueRejector.getWaitingForExecutionTaskCount()); assertEquals(0, queueRejector.getWaitingForExecutionTaskCount(TaskPriority.Low)); }
@Test public void getDefaultPriorityTest() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); assertEquals(testableScheduler.getDefaultPriority(), queueRejector.getDefaultPriority()); }
@Test public void getMaxWaitForLowPriority() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); assertEquals(testableScheduler.getMaxWaitForLowPriority(), queueRejector.getMaxWaitForLowPriority()); }
@Test public void rejectRunnableTest() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); for (int i = 0; i < TEST_QTY; i++) { queueRejector.execute(DoNothingRunnable.instance()); } try { queueRejector.execute(DoNothingRunnable.instance()); fail("Exception should have thrown"); } catch (RejectedExecutionException e) { // expected } // verify the task was never added assertEquals(TEST_QTY, testableScheduler.tick()); // we should be able to add again now for (int i = 0; i < TEST_QTY; i++) { queueRejector.execute(DoNothingRunnable.instance()); } }
@SuppressWarnings("unused") @Test (expected = IllegalArgumentException.class) public void constructorFail() { new PrioritySchedulerServiceQueueLimitRejector(null, TEST_QTY); }
private static void starvablePriorityIgnoredTest(boolean ignored) { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY, ignored); for (int i = 0; i < TEST_QTY; i++) { assertEquals(ignored ? 0 : i, queueRejector.getQueuedTaskCount()); queueRejector.execute(DoNothingRunnable.instance(), TaskPriority.Starvable); } assertEquals(TEST_QTY, testableScheduler.tick()); }
protected void doSchedule(Runnable task, long delayInMillis, TaskPriority priority) { if (dontLimitStarvable && priority == TaskPriority.Starvable) { parentScheduler.schedule(task, delayInMillis, priority); return; } while (true) { int casValue = queuedTaskCount.get(); if (casValue >= getQueueLimit()) { rejectedExecutionHandler.handleRejectedTask(task); return; // in case handler did not throw exception } else if (queuedTaskCount.compareAndSet(casValue, casValue + 1)) { try { parentScheduler.schedule(new DecrementingRunnable(task, queuedTaskCount), delayInMillis, priority); } catch (RejectedExecutionException e) { queuedTaskCount.decrementAndGet(); throw e; } break; } // else loop and retry } }
@Override public SchedulerService makeSchedulerService(int poolSize, boolean prestartIfAvailable) { PriorityScheduler scheduler = schedulerFactory.makePriorityScheduler(poolSize); if (prestartIfAvailable) { scheduler.prestartAllThreads(); } return new PrioritySchedulerServiceQueueLimitRejector(scheduler, Integer.MAX_VALUE); }
@Override public ListenableFuture<?> submit(Runnable task, TaskPriority priority) { return submit(task, null, priority); }
@Override public void execute(Runnable task, TaskPriority priority) { ArgumentVerifier.assertNotNull(task, "task"); doSchedule(task, 0, priority); }
@Override @Test public void getQueuedTaskCountTest() { TestableScheduler testableScheduler = new TestableScheduler(); PrioritySchedulerServiceQueueLimitRejector queueRejector = new PrioritySchedulerServiceQueueLimitRejector(testableScheduler, TEST_QTY); for (int i = 0; i < TEST_QTY; i++) { assertEquals(i, queueRejector.getQueuedTaskCount()); queueRejector.execute(DoNothingRunnable.instance()); } assertEquals(TEST_QTY, testableScheduler.tick()); assertEquals(0, queueRejector.getQueuedTaskCount()); }
@Override public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs, TaskPriority priority) { return submitScheduled(task, null, delayInMs, priority); }
@Override public <T> ListenableFuture<T> submit(Runnable task, T result, TaskPriority priority) { return submit(RunnableCallableAdapter.adapt(task, result), priority); }