2013-08-20 2 views
8

मैं अगर मैं गलत नहीं यह इस तरह दिखना चाहिए हूँ, स्काला में एक प्रसारण रूटर उपयोग करने के लिए कोशिश कर रहा हूँ:पैरामीटरयुक्त अभिनेताओं के साथ अक्का में राउटर कैसे बनाएं?

val system = ActorSystem("My beautiful system") 
val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)), name = "agentRouter") 

है यही कारण है कि मैं the tutorial I am following से समझते हैं।

कार्यकर्ता राउटर दूसरे अभिनेता के रूप में कार्य करता है और मैं इस राउटर को संदेश भेज सकता हूं जो उन्हें सभी एजेंटों (जितने व्यक्तिगत परिभाषाएं हैं) को भेज देगा।

समस्या यह है कि मैं एजेंट बनाने के लिए व्यक्तिगत परिभाषाओं का उपयोग करना चाहता हूं, वे वास्तव में निर्माता में कुछ पैरामीटर लेते हैं और वे पैरामीटर अलग-अलग परिभाषाओं में हैं।

प्रश्न: मैं उन पैरामीटर को कन्स्ट्रक्टर के हिस्से के रूप में उन पैरामीटर को पारित करने के लिए राउटर कैसे कह सकता हूं?

कृपया ध्यान दें कि प्रत्येक अभिनेता को एक व्यक्ति को परिभाषित करना चाहिए और वे सभी अलग हैं। मैं एक संबंधित प्रश्न में समाधान का उपयोग नहीं कर सकता जहां कन्स्ट्रक्टर को स्थिरांक प्राप्त होता है: In Akka Java actor model, can a router create actors with non-default constructor?

कृपया ध्यान दें कि यहां प्रत्येक अभिनेता के पास अलग-अलग पैरामीटर होना चाहिए, यदि उनमें से एक को पुनरारंभ किया गया है तो उसे पहले स्थान पर समान पैरामीटर मिलना चाहिए। मुझे नहीं पता कि उस समाधान को करने के लिए संशोधित किया जा सकता है या नहीं।

सृजन (कन्स्ट्रक्टर) और रूटिंग को अलग करने के लिए एक संभावित समाधान राउटर के रूप में एक अभिनेता का उपयोग कर सकता है, जैसा कि Akka (java), non blocking broadcast to all children प्रश्न में है।

मुझे यकीन नहीं है कि इस मामले में "सही" दृष्टिकोण है। राउटर के रूप में एक अभिनेता का उपयोग करने में कई समस्याएं हैं (लालित्य के अलावा)। मैं ऐसे अभिनेता के बारे में चिंतित हूं जो राउटर के रूप में काम करता है और अपने सभी ग्राहकों को खो देता है। यदि अभिनेता को लूप के आधे भाग में पुनरारंभ किया जाता है तो कुछ अभिनेताओं को कुछ संदेश याद आ सकते हैं यदि मुझे गलत नहीं लगता है।

धन्यवाद।

उत्तर

7

आप किसी भी तर्क से निर्मित कुछ पहले से बनाए गए कलाकारों के मार्ग के रूप में निर्दिष्ट करके राउटर बना सकते हैं।

निम्नलिखित उदाहरण अलग-अलग बनाए गए 2 कलाकार बनाएंगे और फिर एक राउंड रॉबिन राउटर बनाएंगे जो उन्हें संदेशों को रूट करेगा।

class MyActor(param1: String) extends Actor with ActorLogging { 
    def receive: Actor.Receive = { 
    case msg => log.info("Message from {}: {}", param1, msg) 
    } 
} 

object MyActor { 
    def apply(param: String): Props = Props(new MyActor(param)) 
} 

object Main extends App { 
    val system = ActorSystem() 

    val a1 = system.actorOf(MyActor("actor1")) 
    val a2 = system.actorOf(MyActor("actor2")) 

    val routerProps = Props.empty.withRouter(RoundRobinRouter(routees = Vector(a1, a2))) 

    val router = system.actorOf(routerProps) 

    for (i <- 1 to 10) { 
    router ! i 
    } 

    readLine() 
    system.shutdown() 
} 

अधिक यहाँ विवरण: http://doc.akka.io/docs/akka/2.2.0/scala/routing.html

+0

ग्रेट, जो इसे हल करता है और मैंने अक्का के बारे में कुछ और सीखा है। ट्यूटोरियल में दस्तावेज के लिंक होना चाहिए;) (इसके लिए खेद है) – Trylks

1
public class Master extends UntypedActor { 
    ----- 
    ----- 
    public Master() { 
     workerRouter = this.getContext().actorOf(Worker.createWorker().withRouter(new RoundRobinRouter(8)), "workerRouter"); 
    } 
अक्का 2.4.2 के साथ

, हम बस का उपयोग कर सकते हैं:

workerRouter = this.getContext().actorOf(new RoundRobinPool(noOfWorkers).props(Props.create(Worker.class)), "workerRouter"); 

यह मिनट में मार डाला सबसे अच्छा प्रयास कोड है। अक्का में समय

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