2008-08-10 17 views
6

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

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

उत्तर

2

सिंगलेट्स बुरा हैं, आप क्या उम्मीद करते हैं? ;)

शायद सबसे व्यापक दृष्टिकोण एक अलग वर्ग लोडर में एप्लेट का बड़ा भार लोड करना होगा (java.net.URLClassLoader.newInstance का उपयोग करें)। फिर क्लास लोडर को एक एप्लेट के साथ जोड़ने के लिए एक WeakHashMap का उपयोग करें। यदि आप अधिकांश कोड को एक सामान्य वर्ग लोडर (प्रत्येक प्रति-एप्लेट क्लास लोडर के माता-पिता के रूप में) और सामान्य एप्लेट कोडबेस में विभाजित कर सकते हैं, तो यह तेज़ होगा लेकिन अधिक काम करेगा।

अन्य हैक्स:

आप किसी भी घटक के लिए उपयोग किया है, तो आप Component.getParent बार-बार या SwingUtilities.getRoot उपयोग कर सकते हैं।

यदि आप प्रति-एप्लेट उदाहरण थ्रेड में हैं, तो आप एक थ्रेडलोकल सेट अप कर सकते हैं।

ईडीटी से, आप वर्तमान घटना को कतार (java.awt.EventQueue.getCurrentEvent()) से पढ़ सकते हैं, और संभवतः उस से एक घटक पा सकते हैं। वैकल्पिक रूप से एक ओवरकॉइड प्रेषण विधि विधि के साथ एक EventQueue धक्का।

+0

यह (दूर तक) विषय पर मैंने देखा विचारों का सबसे अच्छा संग्रह है। मैं विशेष रूप से "एक अनुकूलित घटनाक्रम धक्का" पसंद करता हूं - और मैं इसे आजमा रहा हूं। –

0

यदि मैं आपको सही ढंग से समझता हूं, तो विचार प्रत्येक कॉलर ऑब्जेक्ट या "संदर्भ" के लिए एक अलग "सिंगलटन" ऑब्जेक्ट प्राप्त करना है। एक चीज जो आप कर सकते हैं वह थ्रेड-स्थानीय ग्लोबल वैरिएबल बनाने के लिए है जहां आप वर्तमान संदर्भ की आईडी लिखते हैं। (यह एओपी के साथ किया जा सकता है।) फिर सिंगलटन गेटर में, संदर्भ आईडी को थ्रेड-लोकल से कॉलिंग संदर्भ के लिए सही "सिंगलटन" उदाहरण की कुंजी के रूप में उपयोग करने के लिए लाया जाता है।

एओपी के संबंध में आपके बिंदु-कटौती के आधार पर एप्लेट्स में इसका उपयोग करने में कोई समस्या नहीं होनी चाहिए, सलाह संकलन समय पर बुनाई जाती है और एक जेएआर रनटाइम निर्भरताओं में जोड़ा जाता है। इसलिए, एओपी का कोई विशेष सबूत रन टाइम पर नहीं रहना चाहिए। threadlocal के बारे में

0

@Hugo:

मुझे लगता है कि समाधान के बारे में सोचा। हालांकि, प्रयोगों से मुझे उस दृष्टिकोण के साथ दो समस्याएं मिलीं:

  1. साझा धागा (सर्वर कनेक्शन, आदि) समस्याग्रस्त हैं। हालांकि इन धागे पर विशेष ध्यान देकर हल किया जा सकता है (वे सभी मेरे नियंत्रण में हैं और विरासत कोड से काफी अलग हैं)।
  2. ईडीटी थ्रेड सभी एप्लेट्स में साझा किया जाता है। मैं प्रत्येक एप्लेट के लिए एक नए ईडीटी थ्रेड के निर्माण को मजबूर करने का एक तरीका खोजने में असफल रहा। इसका मतलब है कि ईडीटी के लिए थ्रेडलोकल एप्लेट्स में साझा किया जाएगा। यह मुझे नहीं पता कि कैसे हल करें। सुझाव?
+0

आपको संग्रह टैग के लिए एक अलग मूल्य का उपयोग कर एक नया ईडीटी थ्रेड प्राप्त करने में सक्षम होना चाहिए।मुझे लगता है कि अगर आप मौजूद हैं तो भी आप अंत में एक यादृच्छिक जार नाम जोड़ सकते हैं। –

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