2010-05-14 13 views
13

मुझे उस जेवीएम में चल रहे जावा कोड के भीतर से JVM के उदाहरण को अनन्य और स्थायी रूप से पहचानने का एक तरीका चाहिए।क्या किसी विशेष JVM इंस्टेंस के लिए वास्तव में अद्वितीय आईडी प्राप्त करना संभव है?

यही है, अगर मेरे पास एक ही मशीन पर एक ही समय में दो JVM चल रहे हैं, तो प्रत्येक अलग-अलग है। यह अन्य मशीनों पर और उसी मशीन पर भविष्य के निष्पादन से JVMs चलाने से भी अलग है, भले ही प्रक्रिया आईडी का पुन: उपयोग किया जाए।

मुझे लगता है कि मैं स्टार्ट टाइम, मशीन मैक और प्रक्रिया आईडी की पहचान करके और इसे किसी तरह से संयोजित करके इस तरह कुछ कार्यान्वित कर सकता हूं। मैं सोच रहा हूं कि इसे हासिल करने के लिए कुछ मानक तरीका है या नहीं।

अद्यतन: मुझे लगता है कि हर किसी ने पूरे सत्र के लिए यूयूआईडी की सिफारिश की है। यह शायद एक अच्छा विचार की तरह लगता है हालांकि संभवतः थोड़ा बहुत भारी वजन। यहां मेरी समस्या है हालांकि: मैं प्रत्येक जेवीएम निष्पादन में कई अद्वितीय पहचानकर्ता बनाने के लिए जेवीएम आईडी का उपयोग करना चाहता हूं जो किसी भी तरह से JVM इंस्टेंस को शामिल करता है।

मेरी समझ यह है कि आपको वास्तव में अन्य संख्याओं को यूयूआईडी में मिश्रित नहीं करना चाहिए क्योंकि विशिष्टता की अब गारंटी नहीं है। यूयूआईडी को एक स्ट्रिंग में बनाने और इसे चेन करने का एक विकल्प है, लेकिन फिर यह बहुत लंबा हो जाता है। इस पर काबू पाने पर कोई विचार?

+0

मैं समझता हूं कि आप एक जेवीएम उदाहरण की विशिष्ट पहचान करने में सक्षम होना चाहते हैं, लेकिन इस जानकारी के साथ आपको अंतर्निहित समस्या क्या है? –

+0

@Thorbjorn: मेरे पास एक वितरित प्रणाली है, और मुझे 1) विशिष्ट रूप से आउटगोइंग पैकेट की पहचान करने की आवश्यकता है।2) इसे 'मानव पठनीय' बनाए रखें ताकि लॉग फाइलों और डीबग जानकारी में मैं तुरंत उसी उदाहरण से आने वाले पैकेट की पहचान कर सकूं। – Uri

उत्तर

10

आप अपने कार्यक्रम की शुरुआत में UUID उत्पन्न कर सकते हैं और उस समय के दौरान प्रोग्राम चला रहे हैं।

UUID id = UUID.randomUUID(); 

विधि इसके अलावा randomUUID() वहाँ अन्य तरीकों UUID रों कि अपनी आवश्यकताओं बेहतर फिट हो सकता है, अधिक जानकारी के लिए वर्ग java.util.UUID की एपीआई दस्तावेज़ देखें उत्पन्न करने के लिए कर रहे हैं।

+1

आपने मुझे 30 सेकंड तक हराया ... – Barry

1

java.rmi.server.UID के सिंगलटन होल्डिंग इंस्टेंस का उपयोग क्यों न करें?

+1

कक्षा 'java.rmi.server.UID' 16-बिट संख्या पर आधारित है। यदि आईडी समय के साथ अद्वितीय होनी चाहिए, तो संभावनाएं इतनी बड़ी हैं कि इस कक्षा का उपयोग करते समय आपको जल्दी या बाद में टक्कर मिल जाएगी। कक्षा 'java.util.UUID' 128-बिट संख्या पर आधारित है, इसलिए टकराव की संभावना बहुत छोटी है। – Jesper

4

आप एप्लिकेशन स्टार्टअप पर यूयूआईडी बना सकते हैं और पहचान के लिए इसका उपयोग कर सकते हैं।

UUID UniqueID = UUID.randomUUID();

2

यदि यूयूआईडी बहुत भारी वजन वाले हैं, तो आपको "विशिष्ट और स्थायी रूप से" का अर्थ क्या है, इसकी समीक्षा करने की आवश्यकता है।

उदाहरण के लिए, यदि आप किसी दिए गए नेटवर्क पर मशीनों के लिए अद्वितीय "अद्वितीय और स्थायी" सीमित करना चाहते हैं, और अगले (कहें) 10 वर्षों के लिए स्थायी, तो आप UUID पीढ़ी में उपयोग किए गए समान दृष्टिकोण का उपयोग कर सकते हैं कम बिट्स

वैकल्पिक रूप से, यदि आप एक सतत स्टोर के साथ एक अद्वितीय आईडी पीढ़ी सेवा बनाना चाहते थे, और उस स्टोर के जीवनकाल में "स्थायी" की धारणा को बांधते हैं, तो अद्वितीय आईडी केवल पूर्णांक के बढ़ते अनुक्रम हो सकते हैं।

1

मुझे इसके लिए एक मानक पुस्तकालय नहीं पता है, लेकिन आप प्रारंभ समय के साथ अपने आप को दूर कर सकते हैं (नए java.util.Date() और System.currentMillis के साथ कुछ गणना करें), पथ का मार्ग स्थापना, और JVM के लिए पथ (केवल सभी System.getProperties() को संयोजित करने पर विचार करें)।

क्या आपके पास एक केंद्रीय सर्वर है जो बात कर सकता है? फिर एक यूयूआईडी केंद्रीय सर्वर से पुनः प्राप्त किया जा सकता है।

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