2012-04-10 12 views
13

के साथ 2.0 खेलें। मैं संभावित रूप से वितरित वातावरण में Play 2.0 में लंबे मतदान को कार्यान्वित कर रहा हूं। जिस तरह से मैं समझता हूं कि जब प्ले को अनुरोध मिलता है, तो उसे अद्यतन की लंबित अधिसूचना निलंबित करनी चाहिए और फिर नए डेटा लाने और दोहराने के लिए डीबी पर जाना चाहिए। मैंने चैट उदाहरण को देखना शुरू किया जो Play 2.0 ऑफ़र करता है लेकिन यह वेबसाईट में है। इसके अलावा ऐसा लगता है कि यह वितरित करने में सक्षम नहीं है। तो मैंने सोचा कि मैं अक्का की घटना बस का उपयोग करूंगा। मैंने ईवेंटस्ट्रीम कार्यान्वयन लिया और लुकअप क्लासिफिकेशन के साथ अपना खुद का दोहराया। हालांकि मैं इस बात पर फंस गया हूं कि मुझे एक संदेश वापस कैसे मिलेगा (या उस मामले के लिए, अभिनेता के बजाय ग्राहक क्या होना चाहिए)?स्कैला में लंबे मतदान को लागू करना और अक्का

EventStream कार्यान्वयन: https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/event/EventStream.scala

उत्तर

5

मुझे यकीन है कि है कि आप क्या देख रहे हैं नहीं कर रहा हूँ, लेकिन वहाँ काफी धूमकेतु की घड़ी नमूने में एक सरल उपाय है, कि तुम AKKA अभिनेताओं उपयोग करने के लिए अनुकूलित कर सकते हैं। यह लंबे मतदान के बजाय एक अनंत iframe का उपयोग करता है। मैंने एक और जटिल अनुप्रयोग के लिए एक अनुकूलित संस्करण का उपयोग किया है जो कई डीबी कॉल कर रहा है और AKKA अभिनेताओं में लंबी गणना करता है और यह ठीक काम करता है।

def enum = Action { 
    //get your actor 
    val myActorRef = Akka.system.actorOf(Props[TestActor]) 

    //do some query to your DB here. Promise.timeout is to simulate a blocking call 
    def getDatabaseItem(id: Int): Promise[String] = { Promise.timeout("test", 10 milliseconds) } 

    //test iterator, you will want something smarter here 
    val items1 = 1 to 10 toIterator 

    // this is a very simple enumerator that takes ints from an existing iterator (for an http request parameters for instance) and do some computations 
    def myEnum(it: Iterator[Int]): Enumerator[String] = Enumerator.fromCallback[String] {() => 
     if (!items1.hasNext) 
     Promise.pure[Option[String]](None) //we are done with our computations 
     else { 

     // get the next int, query the database and compose the promise with a further query to the AKKA actor 
     getDatabaseItem(items1.next).flatMap { dbValue => 
      implicit val timeout = new Timeout(10 milliseconds) 
      val future = (myActorRef ? dbValue) mapTo manifest[String] 

      // here we convert the AKKA actor to the right Promise[Option] output 
      future.map(v => Some(v)).asPromise 
     } 
     } 
    } 

    // finally we stream the result to the infinite iframe. 
    // console.log is the javascript callback, you will want something more interesting. 
    Ok.stream(myEnum(items1) &> Comet(callback = "console.log")) 
    } 

ध्यान दें कि यह fromCallback आप "andthen" के साथ प्रगणक गठबंधन करने के लिए अनुमति नहीं है, वहाँ play2 के ट्रंक संस्करण एक generateM विधि है कि अधिक उपयुक्त आप संयोजनों का उपयोग करना चाहते हैं, तो हो सकता है में है।

यह लंबे मतदान नहीं है, लेकिन यह ठीक काम करता है।

1

मैं एक ही चीज़ की तलाश करते समय आपके प्रश्न पर ठोकर खाई।

मैं के रूप में वे "मौत के स्पिनर" की वजह से वेबकिट ब्राउज़र में (यानी चलता हर समय इसे लोड कर रहा है) अच्छा उदाहरण खोजने

किसी भी तरह, किसी भी भाग्य नहीं था स्ट्रीमिंग का समाधान नाकाफी पाया, लेकिन मैं करने में कामयाब वादे का उपयोग करके अपना स्वयं का प्रमाण-अवधारणा बनाएं: https://github.com/kallebertell/longpoll

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