优雅地重启整个Akka actor系统

7

我该如何优雅地重新启动整个Actor系统?换句话说,停止系统中的所有Actor并使用gracefulStop(或者至少是重要的Actor)。

基本上,我想在测试期间实现应用程序的重新启动,而不需要每次启动一个新的独立JVM的开销。

我正在使用Akka 2.0.5。

2个回答

6

如果你已经实现了一个演员系统,但还缺少一项功能,请不要犹豫再增加一个演员来解决问题:在这种情况下,创建一个专门负责向重要演员发送优雅停止请求并等待其终止的演员。然后,该演员可以关闭演员系统,而你可以从外部使用awaitTermination。如果你使用system.actorOf(Props[Terminator], "terminator")创建了该演员,则可以使用以下代码将其关闭:

system.actorFor("/user/terminator") ! MakeItStop // or whatever message you choose
try system.awaitTermination(1.minute) // or however long it may take
catch {
  case _: TimeoutException => system.shutdown() // as a last resort
}

1

如果是为了单元测试,您可以停止ActorSystem并启动一个新的ActorSystem。

val system1 = ActorSystem("system1")
system1.shutdown() // This is async and will return before the system actually stops.

val system2 = ActorSystem("system2")

我不确定如何重新启动系统(实际上,我不确定上述方法是否有效,但我认为没有理由无法使用)。


我需要确保重要的执行者被允许优雅地停止。 - Robin Green
使用 postStop:http://doc.akka.io/docs/akka/snapshot/scala/actors.html#stop-hook - Emil Ivanov
4
ActorSystem有一个awaitTermination方法,它会阻塞当前线程直到系统关闭。此外,还有一个registerOnTermination方法可以注册用于监听系统关闭的侦听器。 - Endre Varga

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