2014-10-11 8 views
5

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

मैं नीचे दिए गए कोड में किसी अभिनेता से संदेश की प्रतीक्षा कैसे कर सकता हूं?

package api 

import akka.actor.ActorRef 
import scala.concurrent.ExecutionContext 
import spray.routing.Directives 
import core.ClassifierActor 

class ClassifierService(classifier: ActorRef)(implicit executionContext: ExecutionContext) 
    extends Directives with DefaultJsonFormats { 

    import ClassifierActor._ 

    implicit val classifyMessageFormat = jsonFormat4(ClassifyMessage) 

    val route = 
    path("classify") { 
     post { 
     handleWith { 
      // The ClassifierActor gets a ClassifyMessage and 
      // sends a ClassifiedMessage back to the sender. 
      // How can wait for the ClassifiedMessage here 
      // and send a HttpResponse back? 
      cm: ClassifyMessage => classifier ! cm 
      // ??? 
     } 
     } 
    } 

} 
+0

मैंने अपना रूटिंग कोड नहीं लिखा है, इसलिए मुझे सबसे अच्छा तरीका नहीं पता है लेकिन व्यापक रूप से आप कभी इंतजार नहीं करते हैं: इसके बजाय आप एक अभिनेता या शायद भविष्य में लिपटे एक अभिनेता को अनुरोध देते हैं जो कि एक बयान के माध्यम से जिम्मेदार है प्रसंस्करण पूरा होने के बाद उत्तर भेजना। – Rup

+0

मैं स्प्रे के लिए नया हूं, इसलिए मुझे आपके उत्तर से कोई फायदा नहीं मिल सकता है। मुझे कोड के स्निपेट की आवश्यकता होगी। – Max

उत्तर

12

स्प्रे पहले से ही इस प्रकार akka.io

पर आधारित है, तो आप सिर्फ अभिनेता प्रतिक्रिया के साथ अपने मार्ग को पूरा करना चाहते हैं, तो आप पैटर्न

import akka.pattern.ask 
import scala.concurrent.duration._ 
implicit val timeout = Timeout(5 seconds) // needed for `?` below 

val route = 
    path("classify") { 
     post { 
     onComplete(actorResponse(yourActor, yourMessage)) { 
      complete(_) 
     } 
     } 
    } 

def actorResponse[T](actor: ActorRef, msg: ClassifyMessage): Future[T] = 
(actor ? msg).mapTo[T] 

पूछना इस्तेमाल कर सकते हैं आप अग्रेषित करना चाहते हैं अभिनेता प्रणाली में कहीं भी अपने अभिनेता मॉडल और पूर्ण मार्ग से अनुरोध करें, आपको अभिनेताओं को RequestContext को आगे बढ़ाने की आवश्यकता है। शायद, यह example आपकी मदद कर सकता है। सौभाग्य!

+0

धन्यवाद! आप 'आयात scala.concurrent.Future' जोड़ सकते हैं क्योंकि जावा का भविष्य भी है। और 'akka.actor.Actor आयात करें' सिर्फ इसलिए कि इसकी आवश्यकता है। – akauppi

+0

एक महत्वपूर्ण नोट: व्यक्ति पहले से ही अभिनेताओं का उपयोग कर रहा है (क्यू में "क्लासिफायर: एक्टरोरफ" देखें)। यदि कोई आसानी से मल्टीथ्रेड प्रतिक्रिया तर्क के लिए एक रास्ता तलाश रहा है, तो भविष्य [HttpResponse] अभिनेता नहीं, जाने का तरीका है। Https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html देखें – akauppi

3

मेरी उदाहरण परियोजना पर एक नज़र डालें। This service मार्गों को पूरा करने के लिए वायदा का उपयोग करता है। जैसे कि रु ने टिप्पणी की, प्रतिक्रिया के लिए प्रतीक्षा करना बुरा अभ्यास है। भविष्य में तुरंत वापसी करें और परिणाम मिलने पर इसे पूरा करें।

आपके उदाहरण में classifier ! cm अभिनेता "बताएं" पैटर्न का उपयोग कर रहा है। यह cmclassifier अभिनेता को संदेश भेजता है और आगे बढ़ता है। यदि आप भविष्य में प्रतिक्रिया की अपेक्षा करना चाहते हैं तो "पूछें" पैटर्न का उपयोग करें: classifier ? cm। आपके cm अभिनेता की प्राप्त विधि में आप sender ! responseMsg के साथ भविष्य वापस कर देंगे जो भविष्य में वापस आ जाएगा।

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