2015-11-26 14 views
5

Akka'nın aktörleri için "Zarif Duruş" çalışmasını okudum ve test etmek için küçük bir test uygulaması oluşturdum.Aktörün adı zarif duruştan sonra her zaman tekrar kullanılamaz.

Uygulaması "Zarif Dur" http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop belirtilen göstermektedir does not her zaman incelikle Aktör adını durdu yeniden kullanabilirsiniz garanti.

Arada şu istisna görüntülenir:

Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique! 

Bunun nedeni nedir? InvalidActorNameExceptions her şimdi ve sonra görünmeyecek şekilde uygulamayı nasıl düzeltebilirim?

ana sınıfı ...

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.") 
    } 
} 

aktör ...

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 
    } 

} 

ben Scala 2.11.7 ve Java 8 ve Akka ile vardır: Burada

kodudur 2.4.0.

+3

burada ekli bağlantı ve Takip Terminated resepsiyon adaşı başlatın: Uyarı aktör eş zamanlı gerçekleşmeyebilir ayrı etkinlik durdurma ve adı kaydı iptal ediliyor olduklarını unutmayın birbirinden. Bu nedenle, gracefulStop() döndükten sonra hala kullanımda olan adı bulabileceğiniz olabilir. Doğru kayıt silme işlemini garantilemek için, sadece kontrol ettiğiniz bir amirden gelen isimleri ve sadece Sonlandırılmış bir mesaja cevap olarak, yani üst düzey aktörler için değil, isimleri yeniden kullanın. Böylece denetleyici aktörü olun ve yalnızca 'Sonlandırılmış' alımında isimleri başlatın – Odomontois

cevap

7

Commend i sadece bağlantıyı takip ve bir aktör durdurma o

unutmayın Uyarı burada

kırmızı alarm bulundu

buradan kopyalamak edeceğiz, awfull biçimlendirmesi vardır ve numaranın kayıtsız kalması, birbirinden eşzamansız olarak gerçekleşen ayrı olaylardır. Bu nedenle, gracefulStop() döndükten sonra hala kullanımda olan adı bulacaksınız. Uygun kayıt silme işlemini garantilemek için, yalnızca numaralı telefonu kontrol ettiğiniz bir denetim otoritesindeki isimleri ve sadece Terminated mesajına yanıt olarak, yani üst düzey aktörlerini kullanmayın.

Yani gözetmen aktör yapabilir ve yalnızca

İlgili konular