优雅停止后

时间:2015-11-26 12:58:10

标签: scala akka

我为演员研究了Akka的“优雅停止”并创建了一个小测试应用来测试它。

应用程序显示http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop中提到的“优雅停止” 总是保证您可以重复使用优雅停止的Actor名称。

每隔一段时间出现以下异常:

Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique!

为什么?如何修复应用程序,以便InvalidActorNameExceptions不会偶尔出现?

以下是代码:

主要班级......

import akka.actor._
import akka.pattern.gracefulStop
import DummyActor.Stop
import DummyActor

import scala.concurrent.duration._
import scala.concurrent.{Await, Future}

object AkkaTest {
  def main(args: Array[String]) {

    val actorsystem = ActorSystem("testSystem")

    1 to 5 foreach { _ =>

      // Create an actor with name: DummyActor
      val dummyActor = actorsystem.actorOf(Props[DummyActor], "DummyActor")

      // Gracefully stop the DummyActor
      val stopped: Future[Boolean] = gracefulStop(dummyActor, 5 seconds, Stop)
      Await.result(stopped, 6 seconds)
    }

    val terminated: Future[Terminated] = actorsystem.terminate()
    Await.result(terminated, 10 seconds)

    System.out.println("Finished successfully. Try again, eventually it will fail. You can also increase the amount of loops.")
  }
}

和演员......

import akka.actor.Actor
import DummyActor.Stop

object DummyActor {
  case object Stop
}

class DummyActor extends Actor {

  override def receive: Receive = {
    case Stop => context stop self
  }

}

我有Scala 2.11.7以及Java 8和Akka 2.4.0。

1 个答案:

答案 0 :(得分:7)

推荐格式很糟糕,所以我会在这里复制

我只是按照链接发现了红色提醒

  

警告

     

请记住,演员停止并取消注册其名称   是彼此异步发生的独立事件。   因此,您可能会发现该名称仍在使用之后   gracefulStop()返回了。为了保证正确   注销,只重用您控制的主管内的名称   并且只响应Terminated消息,即不是顶级消息   演员。

因此,只有在Terminated接待

时才能成为主管演员并开始同名