我正在研究Java中的调度系统,该系统基于 startDate , endDate 和发生发送提醒(每小时,每天,每周,每月,周一等)。最初我使用 Timer 和 TimerTask 类来安排提醒:
Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);
我最近切换到 ScheduledExecutorService ,因此我可以更好地控制取消事件。 ScheduledExecutorService 适用于定期提醒,但过去使用 startDate 重新安排提醒的情况除外。 scheduleAtFixedRate 函数只允许您为 initialDelay 指定 long 值,而不是实际的 Date 对象:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);
这会带来一个问题,因为传入负的 initialDelay 仍会导致事件立即被触发,从而导致它再次出现在现在 + 期间,而不是 startDate + 期间。
我是否可以(重新)在过去使用 startDate 安排提醒?
答案 0 :(得分:2)
只需快速检查日期是否过去,然后创建一个新的临时开始日期时间,即现在开始的增量。
答案 1 :(得分:0)
我通过在启动时运行一次然后在我每天都想要的时间来解决它:
// 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
);