2014-06-13 12 views
7

मेरे पास एक अभिनेता है, और कुछ संदेश पर मैं कुछ विधि चला रहा हूं जो भविष्य लौटाता है।अभिनेताओं में वायदा के लिए निष्पादन संदर्भ

def receive: Receive = { 

    case SimpleMessge() => 
     val futData:Future[Int] = ... 
     futData.map { data => 
      ... 
     } 
} 

क्या इस डेटा की प्रतीक्षा करने के लिए वास्तविक संदर्भ पारित करना संभव है? या Await सबसे अच्छा है यदि मुझे SimpleMessage में इस डेटा की आवश्यकता है तो मैं सबसे अच्छा कर सकता हूं?

+0

भविष्य से आने वाले डेटा के साथ आप वास्तव में क्या करना चाहते हैं? – cmbaxter

+0

यह मेरे डीबी (मोंगो) से डेटा है, और मैं उन्हें फ़िल्टर करना चाहता हूं और उनमें से केवल कुछ हिस्सा दूसरे संग्रह में सहेजना चाहते हैं। लेकिन मूल रूप से यह डीबी डेटा है, मैं इसे पृष्ठभूमि में नहीं चला सकता, और मुझे अगले * सरल संदेश * से पहले इस क्रिया को समाप्त करने के लिए इंतजार करना होगा। –

+0

क्या यह 'प्रेषक' को वापस संदेश भेज रहा है या नहीं? –

उत्तर

10

तुम सच में भविष्य के लिए अगले संदेश प्रक्रिया से पहले पूरा करने के लिए प्रतीक्षा करने की आवश्यकता है, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

object SimpleMessageHandler{ 
    case class SimpleMessage() 
    case class FinishSimpleMessage(i:Int) 
} 

class SimpleMessageHandler extends Actor with Stash{ 
    import SimpleMessageHandler._ 
    import context._ 
    import akka.pattern.pipe 

    def receive = waitingForMessage 
    def waitingForMessage: Receive = { 

    case SimpleMessage() => 
     val futData:Future[Int] = ... 
     futData.map(FinishSimpleMessage(_)) pipeTo self 
     context.become(waitingToFinish(sender)) 
    } 

    def waitingToFinish(originalSender:ActorRef):Receive = { 
    case SimpleMessage() => stash() 

    case FinishSimpleMessage(i) => 
     //Do whatever you need to do to finish here 
     ... 
     unstashAll() 
     context.become(waitingForMessage) 

    case Status.Failure(ex) => 
     //log error here 
     unstashAll() 
     context.become(waitingForMessage)  
    } 
} 

इस दृष्टिकोण में, हम एक SimpleMessage की प्रक्रिया और उसके बाद तर्क से निपटने छिपाया जा स्विच सभी बाद के SimpleMessage को तब तक प्राप्त हुआ जब तक कि हम भविष्य से नतीजे न लें। जब हमें नतीजा होता है, असफलता या नहीं, तो हम भविष्य के लिए इंतजार करते समय और हमारे मजेदार तरीके से जाने के दौरान प्राप्त अन्य सभी SimpleMessage एस को अनस्टैश करते हैं।

यह अभिनेता सिर्फ दो राज्यों के बीच आगे बढ़ता है और यह आपको भविष्य में ब्लॉक करने की आवश्यकता के बिना एक समय में केवल SimpleMessage को पूरी तरह से संसाधित करने की अनुमति देता है।

+2

वास्तव में संदर्भ आयात करें। डिस्पैचर काम करता है – Oleg

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