//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.schedules; import org.apache.uima.fit.descriptor.ConfigurationParameter; import uk.gov.dstl.baleen.uima.BaleenScheduler; /** * A scheduler which runs a job at a set rate, every X seconds (defined by period). * * Assuming that the job completes before X seconds is up. If the job takes longer than period * seconds it will be run again asap. */ public class FixedRate extends BaleenScheduler { /** * The time in seconds between start of one run and the start of the next. * * @baleen.config 0 */ public static final String PARAM_PERIOD = "period"; @ConfigurationParameter(name = FixedRate.PARAM_PERIOD, defaultValue = "0") private long period; private long lastRunTime = 0; @Override protected boolean await() { return limitRate(); } /** * A helper function for subclasses which will wait for period between runs * * @return true, if successful */ protected boolean limitRate() { final long periodInMs = period * 1000; final long timeSinceLast = System.currentTimeMillis() - lastRunTime; // We are are already over due, run now if (timeSinceLast > periodInMs) { lastRunTime = System.currentTimeMillis(); return true; } // Otherwise block and wait try { Thread.sleep(Math.max(0, periodInMs - timeSinceLast)); lastRunTime = System.currentTimeMillis(); return true; } catch (final InterruptedException e) { getMonitor().warn("Interrupted, stopping the scheduler"); return false; } } }