2012-11-19 12 views
9

एक लंबे समय के जावा ईई देव के रूप में, मैं MDC (मैप नैदानिक ​​संदर्भ) दृष्टिकोण का उपयोग किया है एक अनुरोध है, उदा से संबंधित कई प्रासंगिक डेटा के आसपास गुजर से निपटने के लिए उस अनुरोध के जीवनकाल के दौरान होने वाली कई संभावित लॉग घटनाओं में अनुरोध को ट्रैक करने के लिए एक अनन्य अनुरोध टोकन।कैसे अक्का में अनुरोध प्रासंगिक डेटा की रक्षा करने के

को देखते हुए यह ThreadLocal पर निर्भरता है, यह है कि इस दृष्टिकोण implodes जब अतुल्यकालिक तकनीक का उपयोग बहुत स्पष्ट है।

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

यह बस सबसे अच्छा अभी स्पष्ट रूप से डेटा की इस तरह पारित करने के लिए है चारों ओर संदेश जो अभिनेताओं के बीच में चले जाती हैं के हिस्से के रूप? यह गंदे लगता है लेकिन, साथ ही, आसानी से स्केल करने की क्षमता के साथ संगत।

वहाँ सीधे संदेश के माध्यम से के अलावा अन्य एक अभिनेता के लिए संदर्भ पारित करने के लिए किसी भी अन्य रास्ता नहीं है? साथ ही, Play 2.0 Async ब्लॉक का उपयोग करते समय किसी को भी यही चुनौती का सामना करना पड़ा है?

+4

कलाकारों के बीच संवाद (पास जानकारी) भेजने का एकमात्र तरीका है संदेश और उपलब्ध जानकारी का एकमात्र टुकड़ा संदेश के प्रकार और सामग्री हैं। आप कुछ अलग चैनल का उपयोग करके जानकारी को पूरी तरह से पास नहीं कर सकते हैं। –

+0

@ ड्रूज़िला, क्या आपने कभी इस मुद्दे पर कोई प्रगति की है? मैं स्कैला – devshorts

+0

के साथ खेलने में जीवन चक्र में अनुरोध संदर्भों को ट्रैक करने के बारे में भी उत्सुक हूं संबंधित: https://stackoverflow.com/questions/30091356/mdc-mapped-diagnostic-context-logging-in-akka – dskrvk

उत्तर

1

मैं आप इस कोड में एक ही निष्पादक अंतर्निहित पैरामीटर के रूप में ThreadLocal -s एक स्थिर संदर्भ में घोषणा की, इस्तेमाल कर सकते हैं लगता है:

implicit val executor = context.dispatcher 
val f = Future[Boolean] { 
    someTask() 
} andThen { 
    case err if err.isLeft => log.error("Some error: " + err.left.get); false 
    case ok if ok.isRight => log.info("Good work: " + ok.right.get); true 
} 

हर बार जब भविष्य एक डिस्पैचर के लिए कार्य सबमिट करता है, से एक धागा सुरक्षित संदर्भ वस्तु कॉपी एक धागा दूसरे में। इसलिए, आपको एक कस्टम प्रेषक की आवश्यकता है - किसी भी माध्यम से ThreadLocal पढ़ें, इसे आंतरिक रूप से निष्पादक (प्रेषक) के अंदर कहीं भी स्टोर करें, फिर उस कार्य को सबमिट करें जो पहले ThreadLocal

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