簡體   English   中英

ScheduledExecutorService.scheduleAtFixedRate並將過去的initialDelay設置為日期

[英]ScheduledExecutorService.scheduleAtFixedRate And Setting initialDelay To Date In The Past

我正在使用Java的調度系統,該系統基於startDateendDate事件 (每小時,每天,每周,每月,星期一等)發送提醒。 最初,我使用TimerTimerTask類來安排提醒:

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

我最近切換到ScheduledExecutorService,因此可以對取消事件進行更多控制。 ScheduledExecutorService可以很好地用於重復提醒,但過去的一種情況是使用startDate重新安排提醒。 scheduleAtFixedRate函數僅允許您為initialDelay指定值,而不是實際的Date對象:

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

這帶來了一個問題,因為傳入負的initialDelay仍然會導致事件立即被觸發,從而導致事件在now + period而不是startDate + period再次發生。

有什么想法可以怎樣用startDate來(重新)安排提醒嗎?

只需快速檢查一下日期是否是過去的日期,然后創建一個新的臨時開始日期時間即可,即現在開始的時間增量。

我通過在啟動時運行一次然后在每天都想運行的時候解決了它:

// 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
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM