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
がここ最小限非稼働例を投稿することが、私の単純化が作業例の結果を単純化してみました。)