使用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
只使用dispatch执行http请求并操纵结果,并且不以任何方式直接与akka或调度程序交互。所以,我的问题是:
什么可能导致计划程序的计划失败并突然触发立即执行所有剩余的计划任务?
(PS:我试图简化我的doSomething
在这里发布一个最小的非工作示例,但我的简化导致了工作示例。)< / p>
答案 0 :(得分:0)
确定。我想到了。一旦期货失败,该行
public static void getMaxVotes(int[][][] votes, String[][] uniStud, int size, int size1, PrintWriter uniWrite) {
size = size1 - 1;
int sumStud = 0;
for (int i = 0; i < votes[size].length; i++) {
int totalScore = 0;
for (int j = 0; j < votes[size][i].length; j++) {
int[][] storeSumStud = new int[4][j];
totalScore += votes[size][i][j];
}
System.out.println(uniStud[size][i] + " " + totalScore);
}
}
将终止actor系统,并且将调用所有剩余的计划任务。