ActorSystem.scheduler在事件数量后停止工作

时间:2017-06-28 08:39:14

标签: scala akka scheduler

我有一个scala snipet:

implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
implicit val wsClient = AhcWSClient()
import scala.concurrent.ExecutionContext.Implicits.global    

ActorSystem().scheduler.schedule(30.seconds, 5.minutes)(
{
  Logger.debug("5m tick")
  /* more code */
}

它是家庭自动化应用程序的一部分,需要在重新启动之间长期运行数月。

现在,它每5分钟打一次,并向控制台和文件生成一条日志消息。在Logger调用下运行的方法也非常简单,但它没有出现任何错误。

问题是,在2-3天后,滴答声停止。我已经多次重新运行应用程序,在这段时间之后它似乎停止而没有任何错误。无法在网上找到任何帮助,所以我希望你们中的一些人可能会遇到同样的问题并知道答案。

谢谢,

马丁

1 个答案:

答案 0 :(得分:1)

我无法确切地告诉您有什么问题,但为了使调试更加透明,您可以使用其他方法。

使用代替使用scheduleOnce的演员为自己安排留言,而不是使用普通schedule

def receive: Unit = {
    case "tick" =>
        Logger.debug("5m tick")
        context.system.scheduler.scheduleOnce(5.minutes, self, "tick")
}

在这个actor的父级中你可以使用Restart监督指令,所以如果演员停止,它就会重新启动。

另一个选择是查看Quartz-Scheduler,这对于长时间运行的任务来说更为广泛(并且特别为此而写,与Akka相比)