2009-04-21 16 views
5

जैसा कि मैं इसे समझता हूं, एक बार जब मैंने दो प्रणालियों के बीच एक आरएमआई संचार लिंक स्थापित किया है, तो मैं उस ऑब्जेक्ट को पास कर सकता हूं जो रिमोट विधियों में से एक में "रिमोट" लागू करता है जो उस प्रकार का ऑब्जेक्ट लेता है और दूर-दराज की इच्छा बस नई ऑब्जेक्ट के लिए रिमोट इंटरफ़ेस प्राप्त करें (दूसरे शब्दों में, यह ऑब्जेक्ट को क्रमबद्ध करने के विरोध में एक नया रिमोट कनेक्शन बन जाएगा।)आरएमआई-रिमोट विधि के माध्यम से रिमोट ऑब्जेक्ट को कैसे पास करता है?

क्या यह सही है?

यदि ऐसा है, तो मुझे लगता है कि यह विधि हस्ताक्षर के साथ कुछ करने के लिए है - लेकिन मैं यह जानना चाहता हूं कि यह कैसे निर्धारित करता है कि इसे पूरी वस्तु को क्रमबद्ध करने के बजाय एक नया रिमोट ऑब्जेक्ट बनाना चाहिए।

शब्दों में डालना वाकई मुश्किल है। मुझे इसे आज़माएं:

मान लें कि मेरे पास क्लाइंट और सर्वर सिस्टम है। सर्वर सिस्टम पर मैं क्लाइंट सिस्टम पर एक आरएमआई ऑब्जेक्ट बना और प्रकाशित करता हूं, मैं इंटरफ़ेस पुनर्प्राप्त करता हूं और सर्वर सिस्टम से इंटरैक्ट कर सकता हूं।

Client       Server 
Object1 RemoteIface  ---- Object1 Implementation 

अब तक तो अच्छा। क्लाइंट पर, ऑब्जेक्ट 1.remoteMethod() सर्वर पर निष्पादित करेगा (पैरामीटर पर क्रमबद्ध करने के बाद)।

अब, यहाँ सवाल है, ग्राहक पर मैं इस तरह कोड निष्पादित करें:

Client       Server 
Object1 RemoteIface ----- Object1 Implementation 
Object2 Implementation ----- Object2 RemoteIface  
:

Object2 object2=new object2(); // Also a remote object 
object1.send(object2); 

मैं यह समझ के रूप में, उस बिंदु पर, अपने सिस्टम के लिए एक नया संचार तंत्र होगा

इस बिंदु पर, यदि सर्वर ऑब्जेक्ट 2 पर एक विधि कॉल करता है, तो उस विधि को वास्तव में क्लाइंट पर निष्पादित किया जाएगा।

मैं क्या अंक प्रणाली का निर्णय लेता है पर सोच रहा हूँ (के रूप में यह किसी भी गैर-दूरस्थ वस्तु के साथ होता है) बस यह serializing के बजाय यह करने के लिए।

या क्या मैं पूरी तरह से गलत हूं और यह सिर्फ इसे धारावाहिक बनाता है और मुझे वास्तव में दूरस्थ कॉल बनाने के लिए "getRemoteInterface()" विधि कॉल की आवश्यकता है?

उत्तर

6

इसे Proxy Pattern कहा जाता है। दूरस्थ अंत में तत्काल चीज ने मूल्यों को स्थानांतरित करने और विधियों को सक्रिय करने के लिए कोड उत्पन्न किया है।

java.rmi.Remote खुद ही एक "टैगिंग इंटरफ़ेस" है। वास्तविक कार्य करने के लिए आपको एक कार्यान्वयन की आवश्यकता है। अधिक के लिए this JavaCamp tutorial पर एक नज़र डालें।

अद्यतन: ठीक है, दूसरी दिशा में जा रहा है, हाँ, आपको ऑब्जेक्ट को क्रमबद्ध करने और तार पर होने पर पास करने की आवश्यकता है। शायद सबसे अच्छी बात यह है कि पहले Java Tutorial on RMI के माध्यम से काम करना है। लेकिन, मूल रूप से, Serializable एक और टैगिंग इंटरफ़ेस है जो जावा को बताता है कि ऑब्जेक्ट को आंतरिक स्ट्रिंग प्रारूप में बदलने के लिए तैयार किया गया है, जैसे एक्सएमएल या वाईएएमएल। उस प्रारूप को प्राप्त करने वाले अंत में एक मिलान करने वाली ऑब्जेक्ट में "रीहाइड्रेटेड" किया जा सकता है जब तक कि उस ऑब्जेक्ट के लिए क्लास फाइलें उपलब्ध हों।

+0

मुझे यकीन नहीं है कि आप समझ गए हैं। मैं इसे फिर से लिखने की कोशिश करूंगा ... –

+1

ऐसा लगता है जैसे चार्ली आपके प्रश्न की व्याख्या कर रहा है जैसा मैंने किया था, और अपने जवाब के साथ लक्ष्य पर सही है। यदि आप एक पैरामीटर (या ऑब्जेक्ट लौटाते हैं) जो रिमोट लागू करता है, एक गतिशील प्रॉक्सी कंकाल बनाया जाता है, और उस कंकाल को संबोधित करने वाली एंडपॉइंट जानकारी ("मान" की बजाय "संदर्भ" की तरह होती है)। रिसीवर पर, रिमोट ऑब्जेक्ट से बात करने के लिए एक गतिशील प्रॉक्सी स्टब बनाया जाता है। धारावाहिक के बजाय रिमोट का निर्णय रिमोट इंटरफ़ेस पर आधारित है। – erickson

+0

ठीक है, ऐसा लगता है जैसे आपको यह सही मिला और मैंने बस अपने प्रश्न को दोबारा लिखने का एक गुच्छा बर्बाद कर दिया। लेकिन क्या आप "रिमोटइंटरफेस" भाग पर अधिक स्पष्ट हो सकते हैं? अगर मैं इसे दूरस्थ इंटरफ़ेस में डाल देता हूं, तो क्या यह कार्यान्वयन से इंटरफेस को अलग कर देगा, या क्या इसे विधि कॉल से गुज़रना होगा? –

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