ScheduledExecutorService.scheduleAtFixedRate E Impostazione initialDelay fino ad oggi nel passato

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

  •  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 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?

È stato utile?

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
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top