优雅停止后,不能总是重复使用Actor的名称

Sim*_*imo 6 scala akka

我为演员研究了Akka的"Graceful Stop"并创建了一个小测试应用来测试它.

应用程序显示http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop 中提到的"Graceful Stop" 并不总能保证您可以重复使用正常停止的Actor名称.

偶尔会出现以下异常:

Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique!
Run Code Online (Sandbox Code Playgroud)

这是为什么?如何修复应用程序,以便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.")
  }
}
Run Code Online (Sandbox Code Playgroud)

和演员......

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
  }

}
Run Code Online (Sandbox Code Playgroud)

我有Scala 2.11.7和Java 8和Akka 2.4.0.

Odo*_*ois 8

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

我只是按照链接,在这里发现红色警报

警告

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

因此,请主管演员并在Terminated接待时开始同名