Ho studiato "Graceful Stop" di Akka per gli attori e ho creato una piccola app di test per testarla.Impossibile sempre riutilizzare il nome dell'attore dopo un'interruzione graduale
applicazione dimostra che "Graceful Stop" menzionato nel http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop non fa sempre garanzia che si può riutilizzare il fermato con grazia nome dell'attore.
Ogni tanto appare la seguente eccezione:
Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique!
Perché? Come posso risolvere l'app in modo che InvalidActorNameExceptions non venga visualizzato ogni tanto?
Ecco il codice:
classe principale ...
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.")
}
}
e l'attore ...
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
}
}
ho Scala 2.11.7 e con Java 8 e Akka 2.4.0.
ha seguito il link allegato e qui: Attenzione Tenete a mente che un attore arresto e il suo nome viene annullata la registrazione sono eventi distinti che si verificano in modo asincrono gli uni dagli altri Quindi potrebbe essere che troverai il nome ancora in uso dopo che gracefulStop() ha restituito. Al fine di garantire la debita deregistrazione, riutilizzare solo i nomi all'interno di un supervisore che controlli e solo in risposta a un messaggio Terminato, cioè non per gli attori di alto livello. Quindi, fare l'attore supervisore e avviare l'omonimo solo sulla ricezione 'Terminata' – Odomontois