2010-04-27 3 views
6

एक एकल एप्लिकेशन सर्वर उदाहरण मानें जिसमें दो ईएआर तैनात हैं। पहला ईएआर रिमोट ईजेबी इंटरफेस का उपयोग करते हुए दूसरे ईएआर से ईजेबी को आमंत्रित करता है।ईजेबी स्थानीय/रिमोट इंटरफ़ेस एक ही अनुप्रयोग सर्वर उदाहरण में अलग-अलग अनुप्रयोगों के भीतर

यह अफवाह है कि अगर रिमोट इंटरफेस का उपयोग करके इनवेशन लागू किया गया है, तो एप्लिकेशन सर्वर जानता है कि सब कुछ एक ही जेवीएम के भीतर है और स्थानीय इंटरफ़ेस यांत्रिकी के साथ आंतरिक इंटरफ़ेस का आंतरिक रूप से उपयोग करता है, अर्थात् यह आरएमआई के माध्यम से विधियों को कॉल नहीं करता है, करता है किसी भी सॉकेट को नहीं खोलें, और वस्तुओं को क्रमबद्ध/deserialize नहीं करता है।

क्या यह सच है? अगर किसी को इस मुद्दे के बारे में वेबलॉगिक 10.3.2 और ओसी 4j 10.1.3 के व्यवहार पर प्रतिक्रिया है, तो इसकी सराहना की जाएगी।

उत्तर

1

नहीं, यह सच नहीं है। यदि ओआरबी स्थानीय ऑब्जेक्ट ऑप्टिमाइज़ेशन (कभी-कभी "कोलाक्टेड ऑब्जेक्ट्स") लागू करता है, तो यह किसी भी सॉकेट नहीं खोलता है, लेकिन यह धारावाहिक/deserialization प्रदर्शन करेगा, जो आमतौर पर marshalling से तेज है। प्रोग्रामिंग मॉडल का उल्लंघन करने से बचने के लिए अतिरिक्त ऑब्जेक्ट प्रतियां बनाई गई हैं।

जेनरेटेड स्टब्स इस अनुकूलन को सक्षम करते हैं।

public interface a extends Remote { 
    public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException; 
} 

यहाँ rmic -iiop रखें एक का परिणाम है::

public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException { 
    if (!Util.isLocal(this)) { 
     /* ... trim remote code ... */ 
    } else { 
     ServantObject so = _servant_preinvoke("test",a.class); 
     if (so == null) { 
      return test(arg0, arg1); 
     } 
     try { 
      Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb()); 
      ArrayList arg0Copy = (ArrayList) copies[0]; 
      ArrayList arg1Copy = (ArrayList) copies[1]; 
      ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy); 
      return (ArrayList)Util.copyObject(result,_orb()); 
     } catch (Throwable ex) { 
      Throwable exCopy = (Throwable)Util.copyObject(ex,_orb()); 
      throw Util.wrapException(exCopy); 
     } finally { 
      _servant_postinvoke(so); 
     } 
    } 
} 

जब एक ठूंठ एक स्थानीय वस्तु से जुड़ा है, यह एक का पता लगाने का ObjectImpl._servant_preinvoke कॉल यहाँ एक उदाहरण स्वरूप है नौकर (आपके मामले में एक ईजेबी रैपर) एक ही JVM के भीतर। फिर, यह इनपुट तर्कों की एक प्रति बनाता है (marshalling अनुकरण), विधि कॉल, और परिणाम वस्तु की एक प्रति बनाता है (फिर marshalling अनुकरण)।

मैं एक वेबलॉगिक विशेषज्ञ नहीं हूं। उस ने कहा, इस दस्तावेज़ का तात्पर्य है कि वेबलॉगिक कोलाक्टेड ऑब्जेक्ट ऑप्टिमाइज़ेशन करता है:

http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328

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