我为演员研究了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。
答案 0 :(得分:7)
推荐格式很糟糕,所以我会在这里复制
我只是按照链接发现了红色提醒
警告强>
请记住,演员停止并取消注册其名称 是彼此异步发生的独立事件。 因此,您可能会发现该名称仍在使用之后
gracefulStop()
返回了。为了保证正确 注销,只重用您控制的主管内的名称 并且只响应Terminated
消息,即不是顶级消息 演员。
因此,只有在Terminated
接待