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

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

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

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

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

我无法理解的是为什么每个传球都迟到了,事实上这意味着每次传球而不是1000毫秒需要1100毫秒。 在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) ); 

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

这已在Akka 2.1版中修复。

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