2014-10-24 1 views
8

이미 만든 하나의 액터를 선택하려고합니다. 여기 코드 : actorSelection을 사용하여 akka 배우를 선택하는 방법은 무엇입니까?

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 

는 또한 I 배우에게 메시지를 전달할 수 있고 잘 완료 :

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) 

결과이다. actorSelection 동안 내가 놓친 것은 무엇입니까? 액터를 올바르게 선택하는 방법은 무엇입니까?

그것은 매우 이상하다 업데이트,하지만 교체 할 때 system.actorSelection("/user/myActorName/").resolveOne().valuesystem.actorFor("/user/myActorName/") 모든 작동합니다. actorFor은 액터를 반환합니다. (actorFor으로 인한 올바른 해결책이 아닙니다.)

답변

10

선물에주의하십시오. 귀하의 경우에는 호출 순간에 완료되지 수 있습니다 미래를 수신하고 - 그래서 그 값이 비어있을 수 있습니다

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

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])) 

을 제대로 값을 얻을 onComplete를하거나 for-을 사용하려면 comprehesion :

import scala.concurrent.ExecutionContext.Implicits.global 

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

마음의 onComplete/청취자로 구현을위한하십시오, 그래서 그들은 다른 스레드에서 실행 될 수 있습니다. 현재 스레드에서 결과가 필요하면 클래식 Await.result을 사용하십시오.

+0

매우 놀랍습니다. 나는 resolveOne에서'implicit timeout'을 사용하여 결과를 기다리고 제공한다고 생각했습니다. – Cherry

+0

아니요 :). Scaladoc : "해당 액터가 없거나 제공된 타임 아웃 내에 식별이 완료되지 않은 경우 ActorNotFound 오류로 완료됩니다" – dk14

+0

반환 된 미래를 완료하거나 실패하는 데 시간 초과가 사용되었지만 여전히이 고전적인 방식으로 처리해야합니다 – dk14