2014-10-24 12 views
8

Önceden oluşturulmuş bir aktörü seçmeye çalışıyorum. İşte bir kod geçerli: ActorSelection ile akka aktör nasıl seçilir?

myActor path - akka.tcp://[email protected]:46635/user/myActorName#1444872428 
Selection from spec akka://unit-test/user/myActorName None 
Selection from spec /user/myActorName/ None 

Ayrıca ben aktör bir mesaj geçebilir ve iyi tamamlar:

val myActor = system.actorOf(Props(classOf[MyActor]), "myActorName") 
println("myActor path - " + akka.serialization.Serialization.serializedActorPath(myActor)) 
println("Selection from spec akka://unit-test/user/myActorName " + system.actorSelection("akka://unit-test/user/myActorName").resolveOne().value) 
println("Selection from spec /user/myActorName/ " + system.actorSelection("/user/myActorName/").resolveOne().value) 

sonucudur. ActorSelection sırasında neleri özledim? Oyuncu nasıl düzgün seçilir?

olması çok tuhaf GÜNCELLEME ama yerine ne zaman system.actorSelection("/user/myActorName/").resolveOne().value ile system.actorFor("/user/myActorName/") her şey çalışıyor. Yani actorFor bir oyuncu döndürüyor. (Hangi actorFor nedeniyle doğru bir çözüm değildir)

cevap

10

Lütfen, futures konusunda dikkatli olun. Durumda da çağıran şu anda tamamlanmamış olabilir geleceği alıyoruz - yani değeri boş olabilir:

scala> println("Selection from spec /user/myActorName/ " + system.actorSelection("/user/myActorName/").resolveOne().value) 
Selection from spec /user/myActorName/ None 

vs

scala> val fut = system.actorSelection("/user/myActorName/").resolveOne() 
fut: scala.concurrent.Future[akka.actor.ActorRef] = [email protected] 

<just wait some time here> 

scala> fut.value 
res21: Option[scala.util.Try[akka.actor.ActorRef]] = Some(Success(Actor[akka://default/user/myActorName#1625966960])) 

doğru değeri elde onComplete ya da sadece için- kullanmak için comprehesion:

import scala.concurrent.ExecutionContext.Implicits.global 

for (res <- system.actorSelection("/user/myActorName").resolveOne()) { 
    println(res) 
} 

zihin onComplete/dinleyici olarak uygulanır için bulundurun, böylece farklı bir iş parçacığı yürütülen olabilir. Geçerli iş parçacığında sonuca ihtiyacınız varsa - klasik Await.result'u kullanın.

+0

Çok şaşırtıcı :) Ben 'resolOne' içinde 'kapalı zaman aşımı' beklemek ve sonuç sağlamak için kullanılan olduğunu düşündüm. – Cherry

+0

Nope :). Scaladoc: "Böyle bir aktör yoksa veya tanımlanmış zamanaşımı içinde kimlik tamamlanmadıysa, başarısızlık ActorNotFound ile tamamlandı" – dk14

+0

Gelecekte tamamlanma veya başarısızlık için kullanılan zaman aşımı süresi geldiğinde, ancak yine de bu gelecekteki klasik yolu işlemek zorundasınız – dk14