हमारे सॉफ्टवेयर में हम बड़े पैमाने पर एमडीसी का उपयोग सत्र आईडी और वेब अनुरोधों के लिए उपयोगकर्ता नाम जैसी चीजों को ट्रैक करने के लिए करते हैं। मूल धागे में चलने के दौरान यह ठीक काम करता है। हालाँकि, बहुत सारी चीजें हैं जिन्हें पृष्ठभूमि में संसाधित करने की आवश्यकता है। के लिए हम उपयोग करने वाले java.concurrent.ThreadPoolExecutor
और java.util.Timer
कुछ स्वयं लुढ़का async निष्पादन सेवाओं के साथ कक्षाएं। ये सभी सेवाएँ अपने स्वयं के थ्रेड पूल का प्रबंधन करती हैं।
इस तरह के वातावरण में MDC का उपयोग करने के बारे में लॉबैक के मैनुअल का यही कहना है:
मैप किए गए डायग्नोस्टिक संदर्भ की एक प्रति हमेशा आरंभ करने वाले धागे से श्रमिक धागे से विरासत में नहीं मिल सकती है। यह मामला है जब java.util.concurrent.Executors का उपयोग थ्रेड प्रबंधन के लिए किया जाता है। उदाहरण के लिए, NewCachedThreadPool विधि एक ThreadPoolExecutor बनाता है और अन्य थ्रेड पूलिंग कोड की तरह, इसमें थ्रेड निर्माण तर्क तर्क है।
ऐसे मामलों में, यह अनुशंसा की जाती है कि MDC.getCopyOfContextMap () को निष्पादित करने वाले को कार्य सौंपने से पहले मूल (मास्टर) थ्रेड पर लगाया जाए। जब कार्य चलता है, तो इसकी पहली कार्रवाई के रूप में, इसे MDC.setContextMapValues () को मूल MDC मानों की संग्रहीत प्रतिलिपि को नए एक्ज़ीक्यूटर प्रबंधित थ्रेड के साथ जोड़ने के लिए आमंत्रित करना चाहिए।
यह ठीक होगा, लेकिन उन कॉल को जोड़ना भूल जाना बहुत आसान है, और समस्या को पहचानने का कोई आसान तरीका नहीं है जब तक कि बहुत देर हो चुकी हो। Log4j के साथ एकमात्र संकेत यह है कि आपको लॉग में MDC की जानकारी गायब है, और Logback के साथ आपको बासी MDC जानकारी मिलती है (चूंकि चलने वाले पूल में धागा उसके एमडीसी को पहले कार्य से विरासत में मिला है जो उस पर चलाया गया था)। दोनों एक उत्पादन प्रणाली में गंभीर समस्याएं हैं।
मैं किसी भी तरह से हमारी स्थिति को विशेष नहीं देखता, फिर भी मैं वेब पर इस समस्या के बारे में ज्यादा नहीं जान पाया। जाहिर है, यह ऐसी चीज नहीं है, जिसके खिलाफ कई लोग टकराते हैं, इसलिए इससे बचने का एक तरीका होना चाहिए। हम यहां क्या गलत कर रहे हैं?