तुम सच में भविष्य के लिए अगले संदेश प्रक्रिया से पहले पूरा करने के लिए प्रतीक्षा करने की आवश्यकता है, तो आप कुछ इस तरह की कोशिश कर सकते हैं:
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
को पूरी तरह से संसाधित करने की अनुमति देता है।
भविष्य से आने वाले डेटा के साथ आप वास्तव में क्या करना चाहते हैं? – cmbaxter
यह मेरे डीबी (मोंगो) से डेटा है, और मैं उन्हें फ़िल्टर करना चाहता हूं और उनमें से केवल कुछ हिस्सा दूसरे संग्रह में सहेजना चाहते हैं। लेकिन मूल रूप से यह डीबी डेटा है, मैं इसे पृष्ठभूमि में नहीं चला सकता, और मुझे अगले * सरल संदेश * से पहले इस क्रिया को समाप्त करने के लिए इंतजार करना होगा। –
क्या यह 'प्रेषक' को वापस संदेश भेज रहा है या नहीं? –