什么会导致Akka的调度程序在预定时间之前执行预定任务?

什么会导致Akka的调度程序在预定时间之前执行预定任务?

问题描述:

使用Akka的调度程序时,我遇到了一个奇怪的行为。我的代码看起来大致是这样的:什么会导致Akka的调度程序在预定时间之前执行预定任务?

val s = ActorSystem("scheduler") 

    import scala.concurrent.ExecutionContext.Implicits.global 

    def doSomething(): Future[Unit] = { 
     val now = new GregorianCalendar(TimeZone.getTimeZone("UTC")) 
     println(s"${now.get(Calendar.MINUTE)}:${now.get(Calendar.SECOND)}:${now.get(Calendar.MILLISECOND)}") 

     // Do many things that include an http request using "dispatch" and manipulation of the response and saving it in a file. 
    } 

    val futures: Seq[Future[Unit]] = for (i <- 1 to 500) yield { 
     println(s"$i : ${i*600}") 
     // AlphaVantage recommends 100 API calls per minute 
     akka.pattern.after(i * 600 milliseconds, s.scheduler) { doSomething() } 
    } 
    Future.sequence(futures).onComplete(_ => s.terminate()) 

当我执行我的代码,doSomething最初反复连续调用之间600毫秒叫,符合市场预期。但是,过了一段时间,所有剩余的预定呼叫突然同时执行。

我怀疑我的doSomething里面的东西可能会干扰调度,但我不知道是什么。我的doSomething只是使用调度来处理http请求并操纵结果,并且不以任何方式直接与akka或调度程序进行交互。所以,我的问题是:

什么会导致调度程序的调度失败,并突然触发立即执行所有剩余的调度任务?

(PS:我试图简化我doSomething张贴在这里最小非工作例子,但我的简化导致工作例子。)

确定。我想到了。只要其中一个期货失败,线路

Future.sequence(futures).onComplete(_ => s.terminate()) 

将终止角色系统,并且所有剩余的计划任务将被调用。