2011-04-03 5 views
5

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

मैं उस क्लाइंट के लिए सभी लॉगिंग स्टेटमेंट में क्लाइंट आईडी लॉग करना चाहता हूं। समस्या यह है कि मैं क्लाइंट आईडी को पास करने के लिए विधि हस्ताक्षर संशोधित नहीं करना चाहता हूं।

समाधान है कि मैं के बारे में सोचा हैं:

  1. ग्राहक मूल्य धारण करने के लिए ThreadLocal का उपयोग करना।
  2. रन() में, मैं क्लाइंट आईडी को Thread.currentThread()। SetName (clientId) का उपयोग करके थ्रेड में सेट कर सकता हूं;

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

javadoc में उल्लिखित थ्रेड.सेटनाम() का उपयोग करने के लिए चेतावनी क्या हैं? यह प्रदर्शन को कैसे प्रभावित करता है? Thread.setName() को कॉल करने की चोटी आवृत्ति लगभग 200 प्रति सेकेंड होगी और 0.3 प्रति सेकेंड औसत होगी।

उत्तर

3

आप log4j का उपयोग करते हैं, वहाँ दो वर्गों org.apache.log4j.NDC और org.apache.log4j.MDC के बीच प्रवेश पैटर्न के इस प्रकार, विभाजन से निपटने के लिए एक विशेष तंत्र है।

अपने विशेष परिस्थिति के लिए सबसे अच्छा उपयोग करने के लिए NDC vs MDC - Which one should I use? पर एक ब्राउज़ करें।

यहाँ एक और कड़ी है जो थोड़ा अधिक व्यावहारिक विस्तार से MDC उपयोग का वर्णन करता है: Build Flexible Logs With log4j - O'Reilly Media

ध्यान दें कि अंतर्निहित भंडारण तंत्र MDC/एनडीसी उपयोग करता है (मेरा मानना ​​है कि) वैसे भी ThreadLocal है।

+0

के लिए धन्यवाद यह साफ दिखता है। मैं इसे आजमाऊंगा। धन्यवाद! – Dojo

1

मैं विकसित सॉफ़्टवेयर (प्रिंटरसेवर) में आपके दूसरे दृष्टिकोण का उपयोग करता हूं, लेकिन धागे का लंबा सफर होता है इसलिए "setName()" प्रसंस्करण में विलंबता नहीं जोड़ता है। लॉगिंग चरण धागा नाम दिखा रहा है बहुत अच्छा है।

मुझे लगता है कि "setName()" दो मामले में एक समस्या है:

  1. बहुत कम समय;
  2. धागे अलग-अलग आईडी के साथ अधिक कलाकारों द्वारा उपयोग किया जाता है (लेकिन यह आपका संदर्भ नहीं है, या नहीं?)।

अलविदा। ('नेस्ट और मैप नैदानिक ​​संदर्भ')

+0

आपके इनपुट @ m.genova – Dojo

2

javadoc में उल्लिखित थ्रेड.सेटनाम() का उपयोग करने के लिए चेतावनी क्या हैं? यह प्रदर्शन को कैसे प्रभावित करता है? Thread.setName() को कॉल करने की चोटी आवृत्ति लगभग 200 प्रति सेकेंड होगी और 0.3 प्रति सेकेंड औसत होगी।

प्रदर्शन एक महत्वपूर्ण मुद्दा नहीं होना चाहिए। Thread.setName() एक सुरक्षा जांच करता है और फिर एक विशेषता प्रतिलिपि/सेट करता है। सुरक्षा जांच तब तक सस्ता होनी चाहिए जब तक आपका कोड एक सुरक्षा सैंडबॉक्स में चलने वाला विशेषाधिकार प्राप्त कोड न हो जो Thread.setName() विधि पर अनधिकृत कॉल को रोकता है।

एकमात्र अन्य चेतावनी मैं सोच सकता हूं कि थ्रेड नाम हर समय बदल रहे हैं यदि आप थ्रेडिंग व्यवहार को डीबग करने का प्रयास कर रहे हैं; जैसे थ्रेड डंप को देखकर, आदि

+0

हाँ, परीक्षण के दौरान मैंने कोई महत्वपूर्ण ओवरहेड नहीं देखा। – Dojo

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