55 lines
1.7 KiB
Java
55 lines
1.7 KiB
Java
package nl.andrewlalis.simply_scheduled.schedule;
|
|
|
|
import java.time.Instant;
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.util.Optional;
|
|
|
|
/**
|
|
* A schedule which repeatedly executes a task at a regular interval specified
|
|
* as some integer multiple of a unit of time, such as 5 seconds, or 2 minutes.
|
|
*/
|
|
public class RepeatingSchedule implements Schedule {
|
|
private final ChronoUnit unit;
|
|
private final long multiple;
|
|
private long elapsedIntervals = 0;
|
|
private final Instant start;
|
|
|
|
/**
|
|
* Constructs a new repeating schedule.
|
|
* @param unit The unit of time that the interval consists of.
|
|
* @param multiple The number of units of time that each interval consists of.
|
|
* @param start The starting point for this schedule.
|
|
*/
|
|
public RepeatingSchedule(ChronoUnit unit, long multiple, Instant start) {
|
|
this.unit = unit;
|
|
this.multiple = multiple;
|
|
this.start = start;
|
|
}
|
|
|
|
/**
|
|
* Constructs a new repeating schedule, using {@link Instant#now()} as the
|
|
* starting point.
|
|
* @param unit The unit of time that the interval consists of.
|
|
* @param multiple The number of units of time that each interval consists of.
|
|
*/
|
|
public RepeatingSchedule(ChronoUnit unit, long multiple) {
|
|
this(unit, multiple, Instant.now());
|
|
}
|
|
|
|
/**
|
|
* Computes the next execution time for a task. This keeps track of the last
|
|
* execution time, so that tasks repeat at an exact interval.
|
|
* @param referenceInstant The instant representing the current time.
|
|
* @return The next instant to execute the task at.
|
|
*/
|
|
@Override
|
|
public Optional<Instant> getNextExecutionTime(Instant referenceInstant) {
|
|
return Optional.of(this.start.plus(elapsedIntervals * multiple, unit));
|
|
}
|
|
|
|
@Override
|
|
public void markExecuted(Instant instant) {
|
|
this.elapsedIntervals++;
|
|
}
|
|
}
|