Akka调度程序在异常时停止;它有望吗?

时间:2015-08-27 17:32:28

标签: scala akka

我们运行此代码:

scheduler.schedule(1 minute, 1 minute) { triggerOperations.tick() }

启动我们的应用程序时,其中scheduler是Akka actorSystem.scheduler。 如果tick()抛出异常,则永远不会再调用它!

我检查了文档,但找不到任何预期的声明。大多数描述是“安排一个函数以初始延迟和频率重复运行”,没有提到如果函数抛出一个激活,任务将停止触发。

我们的akka​​版本是2.3.2。

http://doc.akka.io/docs/akka/2.3.4/scala/scheduler.html http://doc.akka.io/api/akka/2.0/akka/actor/Scheduler.html

预计会出现这种情况吗?是否记录在哪里?

1 个答案:

答案 0 :(得分:5)

如有疑问,请前往来源。代码有点简洁,但是this片段:

 override def run(): Unit = {
   try {
     runnable.run()
     val driftNanos = clock() - getAndAdd(delay.toNanos)
     if (self.get != null)
       swap(schedule(executor, this, Duration.fromNanos(Math.max(delay.toNanos - driftNanos, 1))))
   } catch {
      case _: SchedulerException ⇒ // ignore failure to enqueue or terminated target actor
   }

}

表明如果你的runnable抛出,调度程序不会重新安排下一次执行(据我所知,这在swap中发生)。