public ScheduledTask delay(long val) { return delay(Duration.millis(val)); }
@Test public void testScheduledTaskExecutedAfterDelay() throws Exception { int delay = 100; final CountDownLatch latch = new CountDownLatch(1); Callable<Task<?>> taskFactory = new Callable<Task<?>>() { @Override public Task<?> call() { return new BasicTask<Void>(new Runnable() { @Override public void run() { latch.countDown(); }}); }}; ScheduledTask t = new ScheduledTask(taskFactory).delay(delay); Stopwatch stopwatch = Stopwatch.createStarted(); em.submit(t); assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); long actualDelay = stopwatch.elapsed(TimeUnit.MILLISECONDS); assertTrue(actualDelay > (delay-EARLY_RETURN_GRACE), "actualDelay="+actualDelay+"; delay="+delay); assertTrue(actualDelay < (delay+MAX_OVERHEAD_MS), "actualDelay="+actualDelay+"; delay="+delay); }
@Test public void testScheduledTaskExecutedAtRegularPeriod() throws Exception { final int period = 100; final int numTimestamps = 4; final CountDownLatch latch = new CountDownLatch(1); final List<Long> timestamps = Collections.synchronizedList(Lists.<Long>newArrayList()); final Stopwatch stopwatch = Stopwatch.createStarted(); Callable<Task<?>> taskFactory = new Callable<Task<?>>() { @Override public Task<?> call() { return new BasicTask<Void>(new Runnable() { @Override public void run() { timestamps.add(stopwatch.elapsed(TimeUnit.MILLISECONDS)); if (timestamps.size() >= numTimestamps) latch.countDown(); }}); }}; ScheduledTask t = new ScheduledTask(taskFactory).delay(1).period(period); em.submit(t); assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); synchronized (timestamps) { long prev = timestamps.get(0); for (long timestamp : timestamps.subList(1, timestamps.size())) { assertTrue(timestamp > prev+period-EARLY_RETURN_GRACE, "timestamps="+timestamps); assertTrue(timestamp < prev+period+MAX_OVERHEAD_MS, "timestamps="+timestamps); prev = timestamp; } } }
public void start() { synchronized (startStopMutex) { if (state==ListenerState.RUNNING || (scheduledTask!=null && !scheduledTask.isDone())) { LOG.warn("Request to start "+this+" when already running - "+scheduledTask+"; ignoring"); return; } state = ListenerState.RUNNING; Callable<Task<?>> taskFactory = new Callable<Task<?>>() { @Override public Task<Void> call() { return Tasks.<Void>builder().dynamic(false).displayName("periodic-persister").body(new Callable<Void>() { @Override public Void call() { persistNowSafely(); return null; }}).build(); } }; scheduledTask = (ScheduledTask) executionContext.submit(new ScheduledTask(MutableMap.of("displayName", "scheduled[periodic-persister]", "tags", MutableSet.of(BrooklynTaskTags.TRANSIENT_TASK_TAG)), taskFactory).period(period).delay(period)); } }
MutableMap.of("displayName", "scheduled[ssh-location cache cleaner]"), cleanupTaskFactory) .period(expiryDuration) .delay(expiryDuration));