package core.framework.impl.scheduler; import core.framework.api.scheduler.Job; import core.framework.api.util.Strings; import java.time.DayOfWeek; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; /** * @author tminglei, neo */ public final class WeeklyTrigger implements DynamicTrigger { private final String name; private final Job job; private final DayOfWeek dayOfWeek; private final LocalTime time; private final ZoneId zoneId; public WeeklyTrigger(String name, Job job, DayOfWeek dayOfWeek, LocalTime time, ZoneId zoneId) { this.name = name; this.job = job; this.dayOfWeek = dayOfWeek; this.time = time; this.zoneId = zoneId; } @Override public String name() { return name; } @Override public Job job() { return job; } @Override public void schedule(Scheduler scheduler) { ZonedDateTime next = next(ZonedDateTime.now()); scheduler.schedule(this, next); } @Override public String frequency() { return Strings.format("weekly@{}/{}[{}]", dayOfWeek, time, zoneId.getId()); } @Override public ZonedDateTime next(ZonedDateTime now) { ZonedDateTime next = now.withZoneSameInstant(zoneId).plusDays(dayOfWeek.getValue() - now.getDayOfWeek().getValue()).with(time); if (!next.isAfter(now)) { next = next.plusWeeks(1).with(time); // reset time in case the current day is daylight saving start date } return next; } }