ScheduledExecutorService.scheduleAtFixedRate Und Einstellung initialDelay bis Datum in der Vergangenheit

StackOverflow https://stackoverflow.com/questions/3196888

  •  02-10-2019
  •  | 
  •  

Frage

Ich arbeite an einem Scheduling-System in Java, die Erinnerungen sendet basierend auf einem startdate endDate und Vorkommen (stündlich, täglich , wöchentlich, monatlich, montags, etc). Ursprünglich war ich mit Timer und Timertask Klassen, um die Erinnerungen zu planen:

Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);

Ich habe vor kurzem eingeschaltet zu ScheduledExecutorService , damit ich auf Cancelling Ereignisse mehr Kontrolle haben könnte. Die ScheduledExecutorService funktioniert gut für wiederkehrende Erinnerungen, mit Ausnahme des einen Fall von Umplanung eine Erinnerung mit einem startdate in der Vergangenheit. Das scheduleAtFixedRate Funktion können Sie nur angeben lang Wert für initialDelay , und nicht ein tatsächliches Datum Objekt:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);

Dies stellt ein Problem dar, da in einem negativen vorbei initialDelay noch bewirkt, dass das Ereignis sofort so gebrannte zu verursachen es wieder auftritt jetzt + Zeit , anstatt startdate + Zeitraum .

Alle Ideen, wie kann ich (wieder) plane eine Erinnerung mit dem startdate in der Vergangenheit?

War es hilfreich?

Lösung

Just do eine schnelle Überprüfung, um zu sehen, ob das Datum in der Vergangenheit, dann erstellen Sie eine neue temporäre Startdatetime, die die Erhöhung der Starts Vergangenheit ist jetzt.

Andere Tipps

Ich löste es, indem es einmal beim Start und dann zu dem Zeitpunkt läuft ich jeden Tag wollte:

// check once initial on startup
doSomething();

// and then once every day at midnight utc
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
LocalDateTime firstRun = LocalDate.now(ZoneOffset.UTC).atStartOfDay().plusDays(1);
Duration durationUntilStart = Duration.between(LocalDateTime.now(ZoneOffset.UTC), firstRun);
scheduler.scheduleAtFixedRate(
        () -> doSomething(),
        durationUntilStart.getSeconds() + 1,
        Duration.ofDays(1).getSeconds(),
        TimeUnit.SECONDS
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top