如何等待Akka actor系统终止?

19

我需要启动Akka(2.0)的actor系统,发送一些消息,然后等待它完成重要工作。之后,我需要执行与这些actors无关的其他任务。

我尝试使用以下代码等待所有actor停止:

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

所有的演员都通过self ! PoisonPill来自我销毁。我做错了什么?

7个回答

29

在Scala 2.11的Akka 2.4.1中,似乎又有所不同。

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))

接着在MyActor类中,我有这行代码 context.system.terminate()


7
从Akka 2.4开始,您应该使用system.awaitTermination()方法,它会返回一个Future[Terminated]对象,您可以等待其完成。
为了终止系统,您应该使用ActorSystem.terminate方法(例如,在actor完成时从context.system.terminate()中调用)。
来源:发布说明

6
对于那些遇到这个问题的人,需要注意一点:显然,Akka 2.5不再支持actorSystem.awaitTermination。原因可能是Akka避免使用任何阻塞调用的理念。取而代之的是,可以使用actorSystem.registerOnTermination(...)作为在ActorSystem关闭时执行动作的非阻塞方式。
尽管如此,您仍然可以通过ActorSystem.whenTerminated提供的Future等待您的Actor系统完成:
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)

4
我找到了解决方案-只需从主actor调用system.shutdown:
context.system.shutdown

12
请注意:从Akka 2.4开始,您应该使用ActorSystem.terminate()代替ActorSystem.shutdown() - 203

4

您还可以使用system.shutdown从主线程杀死ActorSystem。但是,该操作是异步的。只有在需要阻塞主线程直到完成时才需要使用system.awaitTermination。如果您的并行运行程序对程序的其余部分返回了有用的内容,则最好不要阻塞并继续执行程序。


0
怎么样:
import scala.concurrent.Await
import scala.concurrent.duration._

Await.ready(system.terminate(), 5.seconds)

terminate 返回一个 Future:

def terminate(): Future[Terminated]

你可以等待这个future完成。


0
在Akka 2.3.9中,关闭一个Actor系统并等待其关闭似乎是一个两步过程:
  1. 启动关闭: actorSystem.shutdown
  2. 以阻塞方式等待其终止: actorSystem.awaitTermination

作为步骤(2)的替代方案,可能(尚未测试这些替代方案),您可以轮询isTerminated或使用registerOnTermination在其终止时运行一些代码。因此,值得仔细阅读akka.actor.ActorSystem的注释,以理解和选择这些方法来实现您的代码。

也许我错过了API的其他选项(?)因为Future返回值可能更好。


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