ScheduledExecutorService.scheduleAtFixedRate и установка initialDelay на дату в прошлом - PullRequest
4 голосов
/ 07 июля 2010

Я работаю над системой планирования в Java, которая рассылает напоминания на основе startDate , endDate и вхождения (ежечасно, ежедневно, еженедельно,ежемесячно, понедельник и т. д.).Первоначально я использовал классы Timer и TimerTask для планирования напоминаний:

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

Недавно я переключился на ScheduledExecutorService , чтобы я мог получить большеконтроль отмены событий. ScheduledExecutorService хорошо работает для повторяющихся напоминаний, за исключением одного случая переназначения напоминания с startDate в прошлом.Функция scheduleAtFixedRate позволяет указывать только значение long для initialDelay , а не фактический Date объект:

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

Это создает проблему, поскольку передача отрицательного значения initialDelay по-прежнему приводит к немедленному запуску события, в результате чего оно повторяется с сейчас + period ,вместо startDate + period .

Есть идеи, как можно (пере) запланировать напоминание с startDate в прошлом?

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Просто сделайте быструю проверку, чтобы узнать, была ли дата в прошлом, а затем создайте новую временную дату и время начала, которая является приращением начала, прошедшего сейчас.

0 голосов
/ 05 мая 2018

Я решил это, запустив его один раз при запуске, а затем в то время, которое хотел каждый день:

// 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...