Akka调度器在异常时停止,这是预期的吗?

5
我们运行这段代码:
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

这种行为是否符合预期?它是否在任何地方有记录?


2
正如Tim在下面解释的那样,这是按设计不会重新安排计划的。感谢您指出这一点-我们将改进文档以解释这一点:https://github.com/akka/akka/issues/18346 - Konrad 'ktoso' Malawski
1个回答

6

有疑问时,去查看源代码。代码有点简洁,但此处的片段:

 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
   }

这意味着,如果您的可运行对象抛出异常,调度程序不会重新安排下一次执行(据我理解,在 swap 内部发生此操作)。


谢谢!我对其行为与文档不同感到非常惊讶,以至于我认为自己可能误解了什么。尤其令人困惑的是它是一个“异常”情况,因此在测试期间没有被发现。很高兴看到他们将要更新文档。 - Jonathan Crosmer
顺便提一下,源代码没有告诉我它是设计上的还是不行的,也就是说,这是一个漏洞还是一个特性 :) - Jonathan Crosmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接