Akka调度程序()每次重复都会延迟

bie*_*ior 3 java scheduler akka playframework-2.0

我有一个简单的调度程序,每1秒重复一次任务:

Cancellable task = Akka.system().scheduler().schedule(
        Duration.create(0, TimeUnit.MILLISECONDS),
        Duration.create(1, TimeUnit.SECONDS),
        actor, new TickMsg("Tick", 0, 120)
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,每次传递都是迟到的,ticker-duration所以最终演员在100毫秒之后收到TickMsg - 好的,这在文档中描述并且我很清楚:

它不会在确切的时间执行任务,但在每个滴答声中,它将运行过期的所有内容.

我无法理解的是为什么每一次传球都迟到了,事实上这意味着每次传球1000ms需要1100ms.在10次通过后的结果我们有1秒延迟,1分钟后6秒,1小时后6分钟等...

一些解决方案是将重复持续时间设置得稍短一些,因此在所需的时间点不会迟到,对于一个有效的示例,然后调度程序会根据需要重复执行任务:

Cancellable task = Akka.system().scheduler().schedule(
        Duration.create(0, TimeUnit.MILLISECONDS),
        Duration.create((1000 - tickerDuration/2), TimeUnit.MILLISECONDS),
        actor, new TickMsg("Tick", 0, 120)
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方式有点不舒服,容易忘记,有没有其他方法每x秒(或其他TimeUnit)重复任务而不将其转换为毫秒和缩短?

Rol*_*uhn 5

这已在Akka 2.1版中修复.

原因很简单:HashedWheelTimer不知道重复的任务,所以任务需要重新安排自己,但是因为这在定时器之后发生,它总是会迟到并落入下一个桶中.修复包括漂移校正,详情请见此处.