2014-10-24 18 views
8

Tôi đang cố gắng chọn một diễn viên đã tạo. Dưới đây là một mã số:Làm thế nào để chọn diễn viên akka với diễn viênSelection?

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) 

Kết quả là:

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 

Ngoài ra tôi có thể vượt qua một thông điệp tới diễn viên và nó hoàn thành tốt. Điều gì tôi đã bỏ lỡ trong diễn viênSelection? Làm thế nào để chọn diễn viên đúng cách?

CẬP NHẬT

Nó là rất lạ, nhưng khi tôi thay system.actorSelection("/user/myActorName/").resolveOne().value với system.actorFor("/user/myActorName/") mọi thứ hoạt động. Ý tôi là actorFor trả về một diễn viên. (Đó không phải là giải pháp phù hợp do actorFor không còn được dùng nữa)

Trả lời

10

Hãy cẩn thận với tương lai. Trong trường hợp của bạn, bạn đang nhận được tương lai mà có thể không hoàn thành tại thời điểm gọi điện thoại - vì vậy giá trị của nó có thể rỗng:

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

Để có được giá trị chính xác sử dụng onComplete hoặc chỉ cho- comprehesion:

import scala.concurrent.ExecutionContext.Implicits.global 

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

Hãy nhớ rằng onComplete/for được thực hiện làm người nghe, vì vậy chúng có thể được thực thi theo chuỗi khác nhau. Nếu bạn cần kết quả trong chuỗi hiện tại - hãy sử dụng cổ điển Await.result.

+0

Rất ngạc nhiên :) Tôi nghĩ rằng 'thời gian chờ ngầm định' trong 'resolveOne' được sử dụng để chờ và cung cấp kết quả. – Cherry

+0

Nope :). Scaladoc: "Nó được hoàn thành với sự thất bại ActorNotFound nếu không có diễn viên như vậy tồn tại hoặc xác định không hoàn thành trong thời gian chờ cung cấp" – dk14

+0

Vì vậy, thời gian chờ chỉ được sử dụng để hoàn thành hoặc không quay trở lại trong tương lai, nhưng bạn vẫn phải xử lý theo cách cổ điển trong tương lai – dk14

Các vấn đề liên quan