我需要启动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()
对于遇到这个问题的人来说,这只是个侧面说明:显然,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)
| 归档时间: |
|
| 查看次数: |
19791 次 |
| 最近记录: |