2014-10-24 11 views
8

मैं पहले से ही एक अभिनेता का चयन करने की कोशिश कर रहा हूं। यहाँ एक कोड है:अभिनेता चयन के साथ अक्का अभिनेता का चयन कैसे करें?

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) 

परिणाम है:

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 

इसके अलावा, मैं अभिनेता के लिए एक संदेश पारित कर सकते हैं और यह अच्छी तरह पूरा करता है। अभिनेता चयन के दौरान मुझे क्या याद आया? अभिनेता का चयन कैसे करें?

यह बहुत ही अजीब है UPDATED, लेकिन जब मैं की जगह system.actorSelection("/user/myActorName/").resolveOne().value साथ system.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 या सिर्फ तक- का उपयोग comprehesion:

import scala.concurrent.ExecutionContext.Implicits.global 

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

ध्यान रखें कि onComplete/के लिए श्रोताओं के रूप में लागू किया जाता है में रखें, ताकि वे विभिन्न सूत्र में क्रियान्वित किया जा सकता है। यदि आपको वर्तमान धागे में परिणाम की आवश्यकता है - शास्त्रीय Await.result का उपयोग करें।

+0

बहुत आश्चर्यजनक :) मैंने सोचा कि 'resolOne' में 'अंतर्निहित टाइमआउट' का उपयोग प्रतीक्षा और परिणाम प्रदान करने के लिए किया जाता है। – Cherry

+0

नहीं :)। स्कालाडोक: "यह विफलता अभिनेता नॉटफाउंड के साथ पूरा हो गया है यदि कोई ऐसा अभिनेता मौजूद नहीं है या आपूर्ति समय-समय पर पहचान पूरी नहीं हुई है" – dk14

+0

तो समय-समय पर भविष्य को पूरा करने या विफल करने के लिए उपयोग किया जाता है, लेकिन आपको अभी भी इस भविष्य के शास्त्रीय तरीके से संसाधित करना होगा – dk14

संबंधित मुद्दे