2012-06-25 14 views
9

मैंने आरएमआई का उपयोग कर चारों ओर चर पारित करने के बारे में विभिन्न लेख पढ़े हैं।आरएमआई में संदर्भ द्वारा पारित करना संभव है?

उनमें से कुछ कहते हैं कि आरएमआई में संदर्भों से चर को पार करना असंभव है। उदाहरण: this one और this one

जबकि अन्य कहते हैं कि यह संभव है। उदाहरण: this one, this one और this one

क्या कोई इसे साफ़ कर सकता है? :)

उत्तर

5

महत्वपूर्ण नोट: अगर संदर्भ द्वारा पारित साधन विधि के अंदर तर्क मूल्य को संशोधित करने और फोन करने वाले में मूल चर बदलने के लिए, आप नहीं कर सकते। यदि आप किसी ऑब्जेक्ट के संदर्भ के को कॉपी करना चाहते हैं, तो विधि को आपके किसी ऑब्जेक्ट के साथ इंटरैक्ट करने की अनुमति देने के लिए ... हाँ आप कर सकते हैं। जवाब उस दूसरे विकल्प की पड़ताल करता है।

हां। लेकिन यह एक आरएमआई वस्तु होना है। उस मामले में एक आरएमआई स्टब प्रतिलिपि द्वारा पारित किया जाएगा।

RMI तर्कों से गुजरता है और वापसी के दो तरीके को महत्व देता है: (! यह रिमोट अगर इसकी एक संदर्भ हो गया है)

  1. पूर्ण वस्तु
  2. कॉपी एक दूरस्थ संदर्भ भेजें।

नमूना

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

import java.rmi.Remote; 
import java.rmi.RemoteException; 

// normally published object 
public interface MyService extends Remote 
{ 
    // creates something and return a "handle" to it 
    public MyHandle createX(SomeSerializableObj param1) throws RemoteException; 
} 

// interface for object that the service will return a reference to... 
public interface MyHandle extends Remote 
{ 
    void doOne(); 
    void doTwo(); 
} 

इस उदाहरण आप कर सकते थे में:

MyService के एक कार्यान्वयन बनाएँ और यह

Registry registry = LocateRegistry.createRegistry(port); 
MyService stub = (MyService) UnicastRemoteObject.exportObject(server, 0); 
registry.bind("myService", stub);` 

और फिर, कुछ RMI ग्राहक यह

के लिए एक संदर्भ मिल सकता है प्रकाशित
Registry registry = LocateRegistry.getRegistry(server, port); 
MyService serv1 = (MyService) registry.lookup("myService"); 

और सेवा ऑब्जेक्ट के संदर्भ के साथ अन्य आरएमआई ऑब्जेक्ट का संदर्भ प्राप्त हो सकता है।

MyHandle handle1 = serv1.createX(...); 
handle1.doOne() 

इस उदाहरण विधि तर्क धारावाहिक जाता है (यह एक Serializable वर्ग होना चाहिए) जबकि लौटे वस्तु सर्वर में बनाए गए किसी ऑब्जेक्ट को RMI संदर्भ है।

createX के कार्यान्वयन (...) हो सकता है:

public MyHandle createX(...) { 
    MyHandle handle = new MyHandleImpl(); // create an implementation 
    createdHandlers.add(handle); // add it to some structure (just a sample) 
    return handle; // return the implementation. RMI will send to client a RMI reference to this very instance 
} 
+0

धन्यवाद :) लेकिन मैं काफी अपने जवाब :(नहीं मिलता है आपको एक उदाहरण कृपया प्रदान कर सकते हैं? :) – MBZ

+0

ज़रूर ... मैं उस पल में नहीं हाथ में एक उदाहरण है ... – helios

+1

@MBZ यह मुझे लगता है कि उसने आपको पहले ही एक उदाहरण दिया है, लेकिन यह मूल्य द्वारा पारित संदर्भ का एक और उदाहरण है। यह बिल्कुल संदर्भ से गुजरता नहीं है। कैली में संदर्भ के मान को बदलने से यह कॉलर में नहीं बदलता है। Downvote। – EJP

3
अपने संदर्भ के

:

(1) का कहना है RMI संदर्भ द्वारा पारित समर्थन नहीं करता। मैं सहमत हूँ।

(2) का कहना है कि आरएमआई इन-आउट पैरामीटर का समर्थन नहीं करता है। मैं सहमत हूँ।

(3) संदर्भ द्वारा पारित होने और मूल्य से संदर्भ पारित करने के बीच सामान्य भ्रम प्रदर्शित करता है। आरएमआई उत्तरार्द्ध करता है, बस बाकी जावा की तरह।

(4) गलत है।

(5) केवल सादा अनौपचारिक है। आरएमआई में कोई पास-बाय-रेफरेंस नहीं है।

अतिरिक्त संभावित विफलता मोड के अलावा, जावा के स्थानीय 'संदर्भ-दर-मूल्य' से आरएमआई का रिमोट 'संदर्भ-दर-मूल्य' अनिवार्य रूप से अलग नहीं है।

तुम क्या पढ़ा है का अर्थ है कि गैर दूरदराज के संदर्भ के लिए, RMI वस्तु तर्क और परिणाम के बजाय जावा के तर्क संदर्भ-दर-मूल्य की विधि पारित करके मूल्य, वस्तु क्रमबद्धता के माध्यम से द्वारा पारित कर रहे हैं।

0

शब्द संख्या की सबसे अच्छी समझ में, आप नहीं कर सकते।

जब आप "संदर्भ" द्वारा कुछ पारित करते हैं जो आप वास्तव में कर रहे हैं स्मृति में किसी स्थान पर पॉइंटर पास कर रहा है। यह पूरी तरह से काम करता है जब कॉलर और कैली एक ही प्रक्रिया होती है, उनके पास सटीक ढेर तक पहुंच होती है। लेकिन कंप्यूटर ए से कंप्यूटर बी में एक मेमोरी संदर्भ पास करना अर्थहीन है, ए बीएस मेमोरी * तक नहीं पहुंच सकता है।

हालांकि आरएमआई आपको रिमोट ऑब्जेक्ट्स को "संदर्भ" प्राप्त करने देता है, लेकिन यह बिल्कुल समान नहीं है, और इसे समय से पहले अनुरोध किया जाना चाहिए, सर्वर पर अपनी ऑब्जेक्ट्स को पास करने से एक प्रतिलिपि होगी। घोड़ों मुँह (http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138781.html#3) से

सीधे

RMI मानक जावा ऑब्जेक्ट का उपयोग करता वस्तुओं को पारित करने के लिए serialization तंत्र। रिमोट ऑब्जेक्ट्स के संदर्भ वाले तर्क दूरस्थ संदर्भ के रूप में पारित किए जाते हैं। यदि किसी विधि के लिए तर्क एक आदिम प्रकार या स्थानीय (गैर-दूरस्थ) ऑब्जेक्ट है, तो सर्वर पर एक गहरी प्रतिलिपि पास की जाती है। वापसी मूल्यों को उसी तरह से संभाला जाता है, लेकिन दूसरी दिशा में। आरएमआई आपको स्थानीय ऑब्जेक्ट्स और रिमोट ऑब्जेक्ट्स के संदर्भों के लिए पूर्ण ऑब्जेक्ट ग्राफ़ पास करने और वापस करने देता है।

आप संदर्भ के अनुसार दूरस्थ वस्तुओं को पारित कर सकते हैं, लेकिन आप संदर्भ के रूप में सर्वर पर स्थानीय ऑब्जेक्ट्स को वापस नहीं भेज सकते हैं।

* तकनीकी रूप से कुछ बड़े पैमाने पर वितरित साझा मेमोरी सिस्टम में आप कर सकते हैं, लेकिन मुझे संदेह है कि ओपी क्या बात कर रहा है।

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

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