2013-04-28 9 views
6

जब मैं अभिनेता कॉन्टेक्स्ट के साथ एक पूर्ण पथ का चयन करता हूं तो यह काम नहीं करता है (अभिनेता सही ढंग से चयनित नहीं है और हैलोस्पेन्स संदेश प्राप्त नहीं करता है)?अभिनेता चयन

//From Actor2: 
//This doesn't work (Message never received) 
context.actorSelection("/user/actor1") ! HelloResponse("hello back1") 
//This works (actor 1 receives the message) 
context.system.actorSelection("/user/actor1") ! HelloResponse("hello back2") 

मैं स्काला/अक्का को नौसिखिया हूँ लेकिन reading documentation यह है कि काम करना चाहिए लगता है।

+0

निम्नलिखित प्रदान करें: 2) कोड पता चलता है कि कैसे 'actor1' 3 बनाई गई है) आप से क्या मतलब है 1) स्काला/अक्का संस्करणों" नहीं है काम"? क्या यह संकलित करता है? क्या यह रनटाइम पर अपवाद फेंकता है? क्या 'अभिनेता 1' को 'हैलो रिस्पॉन्स ("हैलो बैक 1") संदेश नहीं मिला है? त्रुटि संदेश क्या कहता है? – agilesteel

+0

मैंने ब्याज के लिए धन्यवाद, काम नहीं करने के बारे में एक स्पष्टीकरण जोड़ा। – lujop

उत्तर

2

जब आप एक अभिनेता के अंदर context.actorSelection का उपयोग करते हैं, तो आप जो कह रहे हैं वह इस अभिनेता नियंत्रण (प्रारंभ/पर्यवेक्षित द्वारा) के तहत एक अभिनेता को ढूंढता है। चूंकि अभिनेता 1 शायद अभिनेता 2 द्वारा शुरू नहीं किया गया था (या अभिनेता 2 द्वारा पर्यवेक्षित नहीं किया गया है), तो यह किसी भी चीज़ का समाधान नहीं करेगा। अगर अभिनेता 1 वास्तव में अभिनेता 2 द्वारा स्वामित्व/शुरू किया गया था तो आप शायद अभिनेता 2 के उस बच्चे अभिनेता को पाने के लिए context.actorSelection("/actor1") कर सकते थे। context.system.actorSelection का कारण यह है कि आप अपनी खोज शुरू करने और अभिनेता के मार्ग को पूरी तरह योग्य बनाने से पहले "अप" system पर जा रहे हैं। अगर आप इसे system.actorOf के रूप में शुरू करते हैं, तो सिस्टम "मालिक" का मालिक है, इसलिए उस पथ का उपयोग करने से आप इसे system से शुरू कर सकते हैं।

एक छोटी सी कोड को दिखाने के लिए मैं क्या मतलब है:

class Actor1 extends Actor{ 
    override def preStart = { 
    context.actorOf(Props[Actor2], "actor2") 
    } 
    def receive = { 
    case _ => 
    } 
} 

class Actor2 extends Actor{ 
    override def preStart = {println("my path is: " + context.self.path)} 
    def receive = { 
    case _ => 
    } 
} 

object FutureTesting { 
    def main(args: Array[String]) { 
    val sys = ActorSystem("test") 
    implicit val ec = sys.dispatcher 

    //Starting an Actor2 from system 
    sys.actorOf(Props[Actor2], "actor2") 

    //Starting an Actor1 from system which in turn starts an Actor2 
    sys.actorOf(Props[Actor1], "actor1") 
    } 
} 

जब आप इस उदाहरण चलाने के लिए, आप देखेंगे:

my path is: akka://test/user/actor1/actor2 
my path is: akka://test/user/actor2 

तो आप देख सकते मैं में चल रहा Actor2 के 2 उदाहरणों है मेरी प्रणाली; sys से सीधे /user/actor2 से जुड़ा हुआ एक लुकअप पथ के रूप में बनाया गया है और Actor1 के उदाहरण से शुरू हुआ है, जो इसके पथ के लिए /user/actor1/actor2 से जुड़ा हुआ है।

अभिनेता प्रणाली पदानुक्रमित है और यह उदाहरण दिखाता है। ActorSystem स्वयं सब कुछ के लिए जड़ है। अभिनेताओं का चयन तब XPath के समान होता है जिसमें संदर्भ आप मामलों से चयन जारी कर रहे हैं।

1

actor2 से आप

context.actorSelection("/actor1") 

उपयोग करने के लिए मैं मानता हूँ यह दिया रूपक एक फाइल सिस्टम है और जब एक फाइल सिस्टम का उपयोग कर एक प्रमुख / एक निरपेक्ष पथ जड़ में शुरू अर्थ है सहज नहीं है की आवश्यकता होगी। इसके अलावा इसके साथ actorFor क्योंकि

context.actorFor("/user/actor1") 

शीर्ष स्तर Actor1 रिटर्न असंगत है (Absolute and Relative Paths देखें)

संपादित करें - यह एक बग है कि अक्का 2.1.4 में तय किया गया था (रोलाण्ड के जवाब देखें)। 2.1.4 से आगे आप context.actorSelection("/user/actor1") का उपयोग कर सकते हैं।

+0

पहला स्निपेट: context.actor चयन ("/ अभिनेता 1") या तो काम नहीं करेगा। यदि फॉरवर्ड स्लैश मौजूद है, तो रोलर उल्लेख के रूप में रूट अभिभावक से शुरू करने वाला अभिनेता चयन हल हो जाएगा। – neowulf33

+0

यह काम कर रहा था लेकिन एक बग था और तब से तय कर दिया गया है। – sourcedelica

+0

बस अक्का 2 के साथ परीक्षण किया।3-एम 2, और context.actor चयन ("/ अभिनेता 1") काम नहीं करता है। अभिनेता चयन रूट अभिभावक पर हल करना शुरू कर देगा। – neowulf33

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