アクターの「グレースフルストップ」を俳優のために勉強し、それをテストするための小さなテストアプリを作成しました。優雅な停止の後、常にアクターの名前を再使用することはできません
アプリケーションは、「正常な停止」はhttp://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop に言及したことを示していますが正常に再利用することができ常に保証は俳優の名前を停止しません。
毎日のようにして、次の例外が表示されます。
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
}
}
私はスカラ座2.11.7およびJava 8とアッカにあります。ここでは
コードです2.4.0。
に同名を開始します。 警告俳優停止し、その名前が登録解除されていることに留意してください は非同期的に起こる別のイベントです互いに。したがって、gracefulStop()が返された後に、まだ使用中の名前が見つかることがあります。適切な登録解除を保証するには、管理している管理者の名前を再利用するだけで、終了したメッセージに応じて、つまり最上位の俳優には返信しないでください。 スーパーバイザーの俳優を作って、「Terminated」受信時にのみ名前を付ける – Odomontois