当前位置: 首页 > 知识库问答 >
问题:

如何等待Akka演员系统终止?

樊运乾
2023-03-14

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

我试图等待所有参与者停止以下代码:

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

所有演员通过<代码>自我自杀!PoisonPill。我做错了什么?

共有2个答案

谷梁凌
2023-03-14

从Akka 2.4开始,您应该使用System.AwaitTermination(),它返回一个您可以等待的Future[Terminated]

为了终止系统,您应该在执行元完成时使用ActorSystem.terminate(例如,Context.system.terminate()

来源:发行说明

邴烨
2023-03-14

在Akka 2.4.1中,对于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))

那么在MyActor类中,我有context.system.terminate()

 类似资料:
  • 我想创建可以从文件系统中为资源服务的参与者。理想情况下,[1]我希望每个目录和每个文件都有一个参与者。但是我不想创建整个actor树层次结构,因为我希望尽可能节省内存和资源。 据我所知,只有当它的父级存在时,才能创建一个演员。懒洋洋地创建这些层次结构的最佳方法是什么。是否有一个钩子可以用来捕捉失败并在飞行中创建参与者层次结构,并有效地这样做? 这样,我就可以向参与者发送、、、...消息,从而使ak

  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?

  • 我正在将现有应用程序从Akka Classic移植到Akka Typed。最初,您可以使用上下文获取对参与者的引用。actorSelection()。resolveOne() 我知道在Akka Type中不再支持这一点,我们应该使用来注册演员以供发现。 但是,我只想将消息发送到本地参与者,即存在于集群中每个节点上的本地单例。我有它的本地路径,但没有对它的直接引用。这是因为它是由Akka管理系统创建

  • java.util.concurrent.CompletionException:Akka.Pattern.AskTimeoutException:收件人[Actor[akka:/web_server/user/MyActor#-769383443]]已终止。发送者[null]发送了类型为“com.data.model.request”的消息。 所以我重写了方法,在那里添加了一个log语句。 现在

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者