scala - Akka 调度器在异常时停止;是预期的吗?

标签 scala akka

我们运行这段代码:

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

在启动我们的应用程序时,调度程序是一个 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

这种行为是预期的吗?它在任何地方都有记录吗?

最佳答案

如有疑问,请转到源。代码有点简洁,但是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 抛出,调度程序不会重新安排下一次执行(据我所知,这发生在交换内部)。

关于scala - Akka 调度器在异常时停止;是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255919/

相关文章:

scala - 使用 Spark SQL GROUP BY 对 DataFrame 进行高效的 PairRDD 操作

scala - 防止在没有封闭对象的情况下从特征创建匿名类

android - 将 android 应用程序与 akka 远程服务器连接

Java & Akka : Creating an actor B from actor A

scala - 为什么constant() 解决方案比 "FP in Scala"5.8 中更简单的解决方案更有效?

scala - scalaz 中的函数语法谜题

scala - scala 规范 2.10 和 2.11 是否存在?

scala - 从 Actor 关闭 Akka Actor 系统

scala - 为什么我们需要在 Scala 中使用隐式参数?

playframework - 在 play framework 2.4.x 中使用依赖注入(inject)测试 actor