我为演员研究了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.
推荐有很糟糕的格式,所以我会在这里复制它
我只是按照链接,在这里发现红色警报
警告
请记住,停止演员及其名称被取消注册是彼此异步发生的单独事件.因此,您可能会在
gracefulStop()返回后发现该名称仍在使用中 .为了保证正确的注销,只能从您控制的主管内重用名称,并且只能响应Terminated消息,即不能用于顶级参与者.
因此,请主管演员并在Terminated接待时开始同名