2015-01-17 20 views
6

में संदेशों को स्थगित करने का सही तरीका मैं दो पेस में वितरित कंप्यूटेशंस करने के लिए अक्का क्लस्टर का उपयोग कर रहा हूं। पहले phaseA फिर phaseB। चरणों को संभालने के लिए मैं अक्का के एफएसएम का उपयोग करता हूं।अक्का

कोई कठोर सिंक्रनाइज़ेशन नहीं है इसलिए नोड्स में से एक phaseB तक पहुंच सकता है जबकि अन्य अभी भी phaseA में हैं।

समस्या है, phaseB में एक (वे phaseA में अभी तक कर रहे हैं) क्या उन्हें phaseB-related संदेशों ढीला करने के लिए कारण बनता है दूसरों के लिए phaseB-related संदेश भेजता है।

के लिए अब मैं अज्ञात संदेशों को स्थगित करने का सरल चाल का उपयोग करें:

case any => self ! any 

लेकिन IMO यह है कि ऐसा करने के लिए उचित तरीका नहीं है। मुझे पता है कि मैं अक्का शेड्यूलर का उपयोग करके any शेड्यूल भी कर सकता हूं, लेकिन मुझे यह पसंद नहीं है।

package whatever 

import akka.actor._ 

object Test extends App { 

    case object PhaseA 
    case object PhaseB 

    class Any extends Actor { 

    def phaseA: Receive = { 
     case PhaseA => { 
     context.become(phaseB) 
     println("in phaseB now") 
     } 
     case any => self ! any 
    } 

    def phaseB: Receive = { 
     case PhaseB => println("got phaseB message !") 
    } 

    def receive = phaseA 

    } 

    val system = ActorSystem("MySystem") 
    val any = system.actorOf(Props(new Any), name = "any") 
    any ! PhaseB 
    any ! PhaseA 
} 

ऐसी स्थिति में संदेशों को स्थगित करने का सही तरीका क्या है:

यहाँ कोड सरल है?

+0

क्या चरण ए में अभिनेता को संदेश कतार में डाल दिया गया है और फिर चरण बी में प्रवेश करते समय उन्हें स्वयं भेज दें। कलाकारों के बारे में कारण जैसे कि वे लोग थे। अगर आप कागज़ के टुकड़े पर एक संदेश भेजते हैं तो आप क्या करेंगे जो आप अभी तक संभालने के लिए तैयार नहीं हैं? जब तक आप इससे निपटने के लिए तैयार न हों तब तक अपनी मेज पर ढेर पर रखो। –

उत्तर

12

आप बाद में प्रसंस्करण के लिए संदेश छीन सकते हैं। अपने अभिनेताओं में akka.actor.Stash और stash() अपने phaseB संदेशों को बाद में मिलाएं।

जब आपका एफएसएम phaseA में है और phaseB संदेश प्राप्त करता है, तो stash() पर कॉल करें। जब वह अभिनेता phaseB स्थिति में परिवर्तित होता है, तो unstashAll() पर कॉल करें और सभी स्टैड किए गए संदेशों को फिर से वितरित किया जाएगा।