ScheduledExecutorService.scheduleAtFixedRate y fijando initialDelay Para fecha en el pasado

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

  •  02-10-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un sistema de programación en Java que envía recordatorios basados ??en un startDate , endDate y ocurrencia (cada hora, diariamente , semanal, mensual, lunes, etc.). Al principio yo estaba usando Temporizador y TimerTask clases para programar los recordatorios:

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

Recientemente he cambiado a ScheduledExecutorService para que pudiera tener un mayor control sobre la cancelación de eventos. El ScheduledExecutorService que está funcionando bien para los recordatorios que se repiten, excepto para el caso de reprogramación de un recordatorio con un startDate en el pasado. El scheduleAtFixedRate función sólo le permite especificar los valor de initialDelay , y no un real Fecha objeto:

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

Esto plantea un problema, ya que pasa de un negativo initialDelay todavía hace que el evento que se disparó de inmediato por lo tanto haciendo que se vuelvan a producir en el ahora + periodo , en lugar de startDate / em> + periodo <.

¿Alguna idea de cómo puedo (re) programar un recordatorio con el startDate en el pasado?

¿Fue útil?

Solución

Sólo hacer una rápida comprobación para ver si la fecha está en el pasado, a continuación, crear una nueva fecha y hora de inicio temporal que es el incremento del pasado empezar ahora.

Otros consejos

Lo resuelto mediante la ejecución de una vez en el arranque y luego en el momento que quería cada día:

// 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
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top