2015-11-26 3 views
5

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.

+3

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

risposta

7

Commend ha formattazione orribile così, io ti copio qui

Ho appena seguito il link e ho trovato allarme rosso qui

Attenzione

Tenete a mente che un attore arresto e il suo nome è stato cancellato sono eventi separati che si verificano in modo asincrono l'uno dall'altro. Quindi potrebbe essere che troverai il nome ancora in uso dopo gracefulStop() restituito. Per garantire la corretta registrazione , riutilizzare solo i nomi all'interno di un supervisore che controlli e solo in risposta a un messaggio Terminated, cioè non per gli attori di livello superiore .

Quindi, fare supervisore attore e iniziare omonimo solo su Terminated reception