ScheduleDexeCutorService.scheduuleatFixEdrate和将initiaLdelay设置为迄今为止
-
02-10-2019 - |
题
我正在使用Java的调度系统,该系统根据一个 开始日期, 结束日期 和 发生 (每小时,每日,每周,每月,星期一等)。最初我正在使用 计时器 和 Timertask 安排提醒的课程:
Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);
我最近切换到 计划ExecutorService 因此,我可以更多地控制取消事件。这 计划ExecutorService 除了重新安排提醒的情况外 开始日期 在过去。这 ScheduleatFixedRate 功能仅允许您指定 长 价值 initiareDelay, ,不是实际的 日期 目的:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);
这提出了一个问题,因为经历了负面 initiareDelay 仍然使事件立即发射,从而使其重新发生 现在 + 时期, , 而不是 开始日期 + 时期.
任何想法我如何(重新)安排提醒 开始日期 在过去?
解决方案
只需进行快速检查以查看日期是否过去,然后创建一个新的临时开始日期,这是现在开始的开始。
其他提示
我通过在启动时运行一次,然后每天想要的时候就解决了它:
// 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
);
不隶属于 StackOverflow