如何终止一个挂着的akka​​演员?

时间:2014-05-22 11:37:01

标签: scala akka actor

我正在为Akka写我的HelloWorld,我修复了(20到50)在主要演员中创建的演员数量,其中一半是简单的计数器,另一半计算阶乘,并以某种方式求和结果。 主要目标是测试Akka如何处理顽皮的悬挂线程。我将半随机时间的Thread.sleeps添加到我的线程中,并通过安排特殊的ForceShutdown案例来定义超时。

想要得到:

  • 1)Main Actor接收StopMessage,从中收集结果 儿童演员并给他们PoisonPill
  • 2)收集完所有结果后,主要的Actor会关闭 系统
  • 3)如果在超时期间没有收集结果,a ForceShutdown案件正在启动,杀死一切并关闭 武力制度。

我得到了什么: 1和2正在运作,但是:

  • 3)一旦触发ForceShutdown,MainActor仍在等待 孩子们要完成他们的工作,它不会终止他们。

我尝试了几种ForceShutdown案例,但大多数都是一样的,等待儿童演员完成未完成的工作。 这是一个例子:

case ForceShutdown =>
  println(s"[${self.path.name}] ForceShutdown received!")
  children foreach { child => system.stop(child) }
  system shutdown

那么,如何强制终止Akka中的演员?

2 个答案:

答案 0 :(得分:2)

在JVM上无法强制关闭任何内容,因为在同一进程中终止某些内容可能会破坏共享状态并导致应用程序损坏。你对Future的想法最初会起作用,但是运行你的失控代码的线程池不会关闭,这意味着JVM不会停止或将累积已经失效的线程池并最终耗尽内存。

因此,您应该设计所有演员以保持响应:如果您需要运行较长的处理任务,您应该将它们分解为演员发送给自己的短步骤。这样终止请求将在适当的时候兑现。

答案 1 :(得分:0)

akka完全是异步过程。即使Kill消息需要等到当前任务完成。它只是Kill获得最高优先级,因此邮箱排队的邮件将被忽略,而PoisonPill就像普通邮件一样,最后会被处理。所以排队的消息必须在演员关闭之前正常处理。