@Override public Executor executor( Group group ) { return job -> schedule( group, job ); }
handles.add( scheduler.schedule( Group.INDEX_POPULATION, task, 0, TimeUnit.MILLISECONDS ) );
@Override public JobHandle schedule( Group group, Runnable job ) { return super.schedule( group, slowRunnable( job ) ); } };
@Test public void shouldRunWithDelay() throws Throwable { // Given life.start(); final AtomicLong runTime = new AtomicLong(); final CountDownLatch latch = new CountDownLatch( 1 ); long time = System.nanoTime(); scheduler.schedule( Group.INDEX_POPULATION, () -> { runTime.set( System.nanoTime() ); latch.countDown(); }, 100, TimeUnit.MILLISECONDS ); latch.await(); assertTrue( time + TimeUnit.MILLISECONDS.toNanos( 100 ) <= runTime.get() ); }
@Test( timeout = 10_000 ) public void waitTerminationOnDelayedJobMustWaitUntilJobCompletion() throws Exception { CentralJobScheduler scheduler = new CentralJobScheduler(); scheduler.init(); AtomicBoolean triggered = new AtomicBoolean(); Runnable job = () -> { LockSupport.parkNanos( TimeUnit.MILLISECONDS.toNanos( 10 ) ); triggered.set( true ); }; JobHandle handle = scheduler.schedule( Group.INDEX_POPULATION, job, 10, TimeUnit.MILLISECONDS ); handle.waitTermination(); assertTrue( triggered.get() ); }
@Test public void shouldNotifyCancelListeners() { // GIVEN CentralJobScheduler centralJobScheduler = new CentralJobScheduler(); centralJobScheduler.init(); // WHEN AtomicBoolean halted = new AtomicBoolean(); Runnable job = () -> { while ( !halted.get() ) { LockSupport.parkNanos( MILLISECONDS.toNanos( 10 ) ); } }; JobHandle handle = centralJobScheduler.schedule( Group.INDEX_POPULATION, job ); handle.registerCancelListener( mayBeInterrupted -> halted.set( true ) ); handle.cancel( false ); // THEN assertTrue( halted.get() ); centralJobScheduler.shutdown(); }
@Test public void taskSchedulerGroupMustNotBeDirectlySchedulable() { life.start(); expectedException.expect( IllegalArgumentException.class ); scheduler.schedule( Group.TASK_SCHEDULER, () -> fail( "This task should not have been executed." ) ); }
@Override public Executor executor( Group group ) { return job -> schedule( group, job ); }