如何等待Akka actor系统终止?

Rog*_*ach 15 scala akka

我需要启动Akka(2.0)演员系统,发送一些消息,然后等待它做繁重的工作.在那之后,我需要做一些与这些演员无关的事情.

我试图等待所有演员停止使用以下代码:

val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
system.awaitTermination // <-- hangs here
Run Code Online (Sandbox Code Playgroud)

所有演员通过自杀self ! PoisonPill.我究竟做错了什么?

Mic*_*sen 24

在Akka 2.4.1 for scala 2.11中,它似乎又有所不同.

system.awaitTermination()已弃用,文档指示我们使用Await.result(system.whenTerminated, timeout).

正如203所说,system.terminate仍然是终止系统的方式.

这是我使用的一些示例代码:

val actorSystem = ActorSystem("ActorSystem")
val myActors = actorSystem.actorOf(Props[MyActor].withRouter(RoundRobinPool(10)), "MyActors")
rainbows.foreach(rainbow => myActors ! rainbow)
Await.ready(actorSystem.whenTerminated, Duration(1, TimeUnit.MINUTES))
Run Code Online (Sandbox Code Playgroud)

然后在MyActor类中我有了这一行 context.system.terminate()


203*_*203 7

从Akka 2.4开始,你应该使用system.awaitTermination()哪个返回Future[Terminated]你可以等待的.

为了终止系统,您应该使用ActorSystem.terminate(例如context.system.terminate(),在演员完成时从演员内部使用).

来源:发行说明


Seb*_*use 5

对于遇到这个问题的人来说,这只是个侧面说明:显然,Akka 2.5不再支持actorSystem.awaitTermination。原因可能是Akka避免出现任何阻塞呼叫的哲学。相反,actorSystem.registerOnTermination(...)它可以用作ActorSystem在关闭状态下执行操作的非阻塞方式。

尽管如此,您仍然可以通过以下方法Future提供的信息,等待actor系统完成ActorSystem.whenTerminated

val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start

import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.whenTerminated, 365.days)
Run Code Online (Sandbox Code Playgroud)