2013-12-09 12 views
8

यह शायद एक बेहद सरल त्रुटि है लेकिन मैं इसे ठीक से काम नहीं कर सकता। मैं स्कैला में एक अभिनेता आधारित आवेदन बनाने के लिए अक्का 2.2.3 का उपयोग कर रहा हूं।एक अभिनेता बनाएं

object Main { 
    def main(args: Array[String]) = { 
    val system = ActorSystem("Test") 
    val discoverer = system.actorOf(Props[Discoverer], "discoverer") 

    implicit val timeout = Timeout(5.seconds) 

    val not = discoverer ? Messages.Find(something) 

    not.onComplete { 
     case Success(va) => println(va) 
     case Failure(err) => println(err) 
    } 
    ... 
    } 
} 

और मुख्य अभिनेता

class Discoverer extends Actor { 
    override def preStart() = { 
    val refresher = context.actorOf(Props[Refresher], "refresher") 
    refresher ! Refresh 
    } 

    def receive = { 
    case _ => sender ! Answer 
    } 
} 

और Refresher अभिनेता

class Refresher extends Actor { 
    ... 
} 

क्या आप इस से दूर रखना चाहिए कि कोई भी है:

सरलीकृत सेटअप निम्नलिखित है मेरे कलाकारों ने रचनाकारों को पैरामीटर बनाया है।

हालांकि यह

[ERROR] [12/09/2013 13:17:06.893] [Test-akka.actor.default-dispatcher-3] 
[akka://Test/user/discoverer] no matching constructor found on 
    class Discoverer$Refresher for arguments [] 

क्या मेरी त्रुटि यहाँ है के साथ विफल हो अगर मैं अपने आवेदन चलाने का प्रयास? क्या मुझे अपने अभिनेताओं को .actorOf(Props[Class], "actorname") के साथ बनाना नहीं है?

+3

मुझे बहुत यकीन है कि समस्या यह है कि आप एक रिफ्रेशर क्लास के लिए आंतरिक कक्षा का उपयोग कर रहे हैं। क्यों नहीं कह सकता –

+1

@ ओम-नाम-नाम वह समस्या थी। धन्यवाद। हालांकि यह जानना अच्छा होगा कि यह मामला क्यों है। – mgttlinger

उत्तर

11

यदि आप नेस्टेड कक्षाओं के साथ यह काम करना चाहते हैं, तो आपको एक अभिनेता के रूप में संलग्न अभिनेता के संदर्भ में घोंसला वाले अभिनेता को तुरंत चालू करने की आवश्यकता होगी। आप जो त्रुटि देख रहे हैं वह कह रही है कि no-args कन्स्ट्रक्टर नहीं है, इसलिए यह एक संकेत है। चीजें काम करने के लिए कोड इस तरह दिखेगा:

object InnerTest { 
    def main(args: Array[String]) { 
    val sys = ActorSystem("test") 
    sys.actorOf(Props[OuterActor]) 
    } 
} 

class OuterActor extends Actor{ 

    override def preStart = { 
    context.actorOf(Props(classOf[InnerActor], this), "my-inner-actor") 
    } 

    def receive = { 
    case _ => 
    } 

    class InnerActor extends Actor{ 
    def receive = { 
     case _ => 
    } 
    } 
} 

मेरा अनुमान है कि यह एक संदर्भ दे रही है यह बाहरी वर्ग है करने के लिए बिना एक गैर स्थिर भीतरी वर्ग (प्रतिबिंब के माध्यम से) का दृष्टांत करने की कोशिश कर के साथ क्या करना पड़ता है।

https://www.assembla.com/spaces/akka/tickets/3675#/activity/ticket:

+0

अच्छा संकेत, हालांकि प्रस्तुत समाधान मेरे लिए काम नहीं किया। मैंने सहयोगी वस्तु में एक प्रोप विधि परिभाषित की। – Mahdi

1

Refresher, Discoverer की एक आंतरिक वर्ग है, तो इसके आप Refresher का एक उदाहरण आप का एक उदाहरण के संदर्भ में यह सब करने की ज़रूरत बनाना चाहते हैं मैं इस पोस्ट को पढ़कर यह निर्धारित Discoverer

इस उदाहरण लें:

class A{ 
    class B{} 
} 

मैं new A कर सकते हैं, लेकिन new B एक त्रुटि वापस आ जाएगी। मुझे करना है:

val a = new A 
val b = new a.B 

यही कारण है कि अक्का इस अभिनेता को बनाने में विफल रही।

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