2017-10-21 6 views
1

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

答えて

0

[OK]をクリックします。私はそれを考え出した。先物の1つが失敗するとすぐに、

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

は、俳優システムを終了し、残りのスケジュールされたタスクはすべて呼び出されます。

関連する問題