2008-09-19 11 views
12

सर्वर-पक्ष पर आरएमआई के लिए, क्या हमें rmiregistry प्रोग्राम शुरू करने की आवश्यकता है, या बस LocateRegistry.createRegistry पर कॉल करें? यदि दोनों संभव हैं, तो फायदे और नुकसान क्या हैं?आरएमआई सर्वर: rmiregistry या LocateRegistry.createRegistry

उत्तर

7

वे एक ही बात हैं ... rmiregistry एक अलग प्रोग्राम है, जिसे आप कमांड लाइन या स्क्रिप्ट से चला सकते हैं, जबकि LocateRegistry.createRegistry प्रोग्रामिंग के समान ही काम करता है।

मेरे अनुभव में, "असली" सर्वर के लिए आप rmiregistry उपयोग करने के लिए तो आपको पता है कि यह हमेशा के क्लाइंट अनुप्रयोग शुरू कर दिया है या नहीं परवाह किए बिना चल रहा है चाहते हैं। createRegistry परीक्षण के लिए बहुत उपयोगी है, क्योंकि आप आवश्यकतानुसार रजिस्ट्री को शुरू और बंद कर सकते हैं।

+0

क्या "localhost" के अलावा इंटरफेस पर काम करने के लिए रजिस्ट्री बनाने का कोई तरीका है? – Eagle

+0

अद्यतन: प्रलेखन कहता है '' createRegistry '' लोकलहोस्ट पर एक रजिस्ट्री निर्यात करता है। हालांकि, रजिस्ट्री बाहरी-सामने वाले इंटरफेस से कनेक्शन स्वीकार करने में सक्षम है। – Eagle

+0

@Eagle एक रजिस्ट्री निर्यात * स्थानीयहोस्ट में चल रहा है। इसमें कोई निहितार्थ नहीं है कि यह केवल 127.0.0.1 को सुन रहा है। – EJP

0

यदि आप एक स्टैंडअलोन जावा एप्लिकेशन लिख रहे हैं तो आप अपनी खुद की आरएमरेग्रिस्ट्री शुरू करना चाहते हैं, लेकिन यदि आप एक जे 2 ईई ऐप लिख रहे हैं जो स्पष्ट रूप से जे 2 ईई कंटेनर के अंदर चलता है तो आप "लोकेट रजिस्ट्री" चाहते हैं क्योंकि पहले से ही एक चल रहा है ऐप सर्वर!

+0

असत्य और अप्रचलित। आप एक स्टैंडअलोन प्रोग्राम में भी LocateRegistry का उपयोग करना चाह सकते हैं। – EJP

0

यदि आप अपनी आरएमआई सेवाओं को निर्यात करने के लिए वसंत का उपयोग करते हैं, तो यह स्वचालित रूप से रजिस्ट्री शुरू करता है यदि कोई पहले से चल रहा नहीं है। RmiServiceExporter

+0

क्या आप इस सुविधा के लिए दस्तावेज़ों के लिंक को शामिल करने के लिए इसे संपादित कर सकते हैं? –

4

यदि हम पहले rmiregistry शुरू करते हैं, तो RmiServiceExporter स्वयं को चल रहे rmiregistry में पंजीकृत कर देगा। इस मामले में, हमें सिस्टम प्रॉपर्टी 'java.rmi.server.codebase' सेट करना होगा जहां 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub' क्लास पाया जा सकता है। अन्यथा, RmiServiceExporter शुरू नहीं किया जाएगा और अपवाद मिल गया " ClassNotFoundException वर्ग नहीं मिला: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; नेस्टेड अपवाद नहीं है: ..."

यदि आपका RMI सर्वर, RMI ग्राहक और rmiregistry उसी फाइल सिस्टम तक पहुंच सकते हैं, आप सिस्टम प्रॉपर्टी को स्वचालित रूप से कॉन्फ़िगर करना चाहते हैं जहां spring.jar साझा फाइल सिस्टम पर पाया जा सकता है। निम्नलिखित उपयोगिता वर्ग और वसंत विन्यास दिखाता है कि यह कैसे प्राप्त किया जा सकता है।

abstract public class CodeBaseResolver { 
    static public String resolveCodeBaseForClass(Class<?> clazz) { 
    Assert.notNull(clazz); 
    final CodeSource codeSource = clazz.getProtectionDomain().getCodeSource(); 
    if (codeSource != null) { 
     return codeSource.getLocation().toString(); 
    } else { 
     return ""; 
    } 
    } 
} 

public class SystemPropertyConfigurer { 
    private Map<String, String> systemProperties; 
    public void setSystemProperties(Map<String, String> systemProperties) { 
    this.systemProperties = systemProperties; 
    } 

    @PostConstruct 
    void init() throws BeansException { 
    if (systemProperties == null || systemProperties.isEmpty()) { 
     return; 
    } 
    for (Map.Entry<String, String> entry : systemProperties.entrySet()) { 
     final String key = entry.getKey(); 
     final String value = SystemPropertyUtils.resolvePlaceholders(entry.getValue()); 
     System.setProperty(key, value); 
    } 
    } 
} 


<bean id="springCodeBase" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="staticMethod" value="xx.CodeBaseResolver.resolveCodeBaseForClass" /> 
    <property name="arguments"> 
    <list> 
     <value>org.springframework.remoting.rmi.RmiInvocationWrapper_Stub</value> 
    </list> 
    </property> 
</bean> 

<bean id="springCodeBaseConfigurer" class="xx.SystemPropertyConfigurer" 
    depends-on="springCodeBase"> 
    <property name="systemProperties"> 
    <map> 
     <entry key="java.rmi.server.codebase" value-ref="springCodeBase" /> 
    </map> 
    </property> 
</bean> 

<bean id="rmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter" depends-on="springCodeBaseConfigurer"> 
    <property name="serviceName" value="XXX" /> 
    <property name="service" ref="XXX" /> 
    <property name="serviceInterface" value="XXX" /> 
    <property name="registryPort" value="${remote.rmi.port}" /> 
</bean> 

ऊपर के उदाहरण दिखाता है कि प्रणाली संपत्ति स्वचालित रूप से सेट किया जा केवल जब RMI सर्वर, RMI ग्राहक और RMI रजिस्ट्री एक ही फाइल सिस्टम का उपयोग कर सकते हैं। यदि यह सत्य नहीं है या वसंत कोडबेस को अन्य विधि (उदा। HTTP) के माध्यम से साझा किया जाता है, तो आप अपनी आवश्यकता के अनुसार कोडबेस रीसोलवर को संशोधित कर सकते हैं।

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