我正在使用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
);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top