ScheduledExecutorService.scheduleAtFixedRate E Impostazione initialDelay fino ad oggi nel passato
-
02-10-2019 - |
Domanda
Sto lavorando su un sistema di programmazione in Java che invia promemoria basati su una startDate , endDate e occorrenza (oraria, giornaliera , settimanale, mensile, lunedì, etc). Originariamente Stavo usando Timer e TimerTask classi per pianificare i promemoria:
Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);
Di recente ho passato a ScheduledExecutorService , così ho potuto avere un maggiore controllo sulla cancellazione di eventi. Il ScheduledExecutorService sta lavorando bene per i ricordi ricorrenti, ad eccezione di un caso di rinegoziazione di un promemoria con una startDate in passato. Il scheduleAtFixedRate funzione solo permette di specificare molto il valore per initialDelay , e non un vero e proprio Data ??em> oggetto:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);
Ciò pone un problema, dal momento che passa in negativo initialDelay fa sì che ancora l'evento per essere licenziato immediatamente così inducendolo a ripresentarsi a oggi + Periodo , anziché startDate + periodo .
Tutte le idee come posso (ri) programmare un promemoria con il startDate in passato?
Soluzione
Basta fare un rapido controllo per vedere se la data è nel passato, quindi creare un nuovo inizio datetime temporanea che è l'incremento del passato inizio ora.
Altri suggerimenti
ho risolto eseguendo una volta all'avvio e poi, al momento ho voluto tutti i giorni:
// 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
);