如何从play框架中的控制器发送Akka actor关闭消息

时间:2013-12-19 07:47:36

标签: scala playframework event-handling akka

我是Akka的新手但已经非常喜欢这个框架了。我查看了Akka Actor documentation和一些Playframework / typesafe教程。我已经通过

在控制器中成功创建了一个来自成功POST请求的actor
val reapeter = Akka.system.actorOf(Props(classOf[RepeaterActor], data), name = "repeater")

使用计划任务执行定期任务。

现在我想从控制器中的GET / POST请求发送此actor一个停止消息。我试过了

def stop = Action {
    val sendStop = Akka.system.actorSelection("/user/repeater").tell(Shutdown, ActorRef.noSender)
}

以及RepeaterActor的接收方法

receieve {
    ...
    case Shutdown => {
        println("shutting down")
        context.system.stop(self)
    }
}

但我无法得到答复。我不确定我的actorSelection方法是否存在问题,或者我是如何进行消息调用的。如何为可从控制器调用的actor实现简单的关闭钩子?目前只需要有一个RepeaterActors。

1 个答案:

答案 0 :(得分:2)

首先,println不是一个好的解决方案。更好地使用记录器:

import play.api.Logger 
val logger = Logger("akka")
logger.debug("shutting down")

第二件事是“杀死”演员。只需发送PoisonPill即可通过内置方式完成此操作。此外,如果您要记录Actor.postStop方法和日志内部。

def postStop(): Unit = {
  logger.debug("shutting down")
  super.postStop()
}

通过这种结构,您可以检查是否正确关闭。