什么会导致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())
将终止角色系统,并且所有剩余的计划任务将被调用。