सर्वर-पक्ष पर आरएमआई के लिए, क्या हमें rmiregistry
प्रोग्राम शुरू करने की आवश्यकता है, या बस LocateRegistry.createRegistry
पर कॉल करें? यदि दोनों संभव हैं, तो फायदे और नुकसान क्या हैं?आरएमआई सर्वर: rmiregistry या LocateRegistry.createRegistry
उत्तर
वे एक ही बात हैं ... rmiregistry
एक अलग प्रोग्राम है, जिसे आप कमांड लाइन या स्क्रिप्ट से चला सकते हैं, जबकि LocateRegistry.createRegistry
प्रोग्रामिंग के समान ही काम करता है।
मेरे अनुभव में, "असली" सर्वर के लिए आप rmiregistry
उपयोग करने के लिए तो आपको पता है कि यह हमेशा के क्लाइंट अनुप्रयोग शुरू कर दिया है या नहीं परवाह किए बिना चल रहा है चाहते हैं। createRegistry
परीक्षण के लिए बहुत उपयोगी है, क्योंकि आप आवश्यकतानुसार रजिस्ट्री को शुरू और बंद कर सकते हैं।
यदि आप एक स्टैंडअलोन जावा एप्लिकेशन लिख रहे हैं तो आप अपनी खुद की आरएमरेग्रिस्ट्री शुरू करना चाहते हैं, लेकिन यदि आप एक जे 2 ईई ऐप लिख रहे हैं जो स्पष्ट रूप से जे 2 ईई कंटेनर के अंदर चलता है तो आप "लोकेट रजिस्ट्री" चाहते हैं क्योंकि पहले से ही एक चल रहा है ऐप सर्वर!
असत्य और अप्रचलित। आप एक स्टैंडअलोन प्रोग्राम में भी LocateRegistry का उपयोग करना चाह सकते हैं। – EJP
यदि आप अपनी आरएमआई सेवाओं को निर्यात करने के लिए वसंत का उपयोग करते हैं, तो यह स्वचालित रूप से रजिस्ट्री शुरू करता है यदि कोई पहले से चल रहा नहीं है। RmiServiceExporter
क्या आप इस सुविधा के लिए दस्तावेज़ों के लिंक को शामिल करने के लिए इसे संपादित कर सकते हैं? –
यदि हम पहले 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) के माध्यम से साझा किया जाता है, तो आप अपनी आवश्यकता के अनुसार कोडबेस रीसोलवर को संशोधित कर सकते हैं।
- 1. जावा: सॉकेट या आरएमआई?
- 2. जावा आरएमआई सर्वर
- 3. कनेक्शन 127.0.1.1 जावा आरएमआई
- 4. विशेष पोर्ट पर चल रहे rmiregistry को बंद करने के लिए कैसे?
- 5. आरएमआई
- 6. आरएमआई और अपवाद
- 7. आरएमआई रजिस्ट्री
- 8. जावा आरएमआई
- 9. हेड फर्स्ट जावा - आरएमआई मुद्दे
- 10. जावा: आरएमआई बनाम वेब सर्विसेज
- 11. सरल आरएमआई कॉलबैक उदाहरण
- 12. आरएमआई बनाम आरईएसटी सेवा
- 13. क्या मुझे काम करने के लिए आरएमआई के लिए क्लाइंट, सर्वर और रजिस्ट्री पर सभी कक्षाओं की आवश्यकता है?
- 14. मैं श्रेणीबद्धता को कैसे सेट करूं जो rmiregistry उपयोग करता है?
- 15. एकल आरएमआई रजिस्ट्री
- 16. सी # रिमोट विधि आमंत्रण (आरएमआई)
- 17. जावा आरएमआई ट्रेसिंग
- 18. जावा आरएमआई: स्निफर को
- 19. आरएमआई और कोर्बा मतभेद?
- 20. बदलें डिफ़ॉल्ट आरएमआई पोर्ट (जावा)
- 21. आरएमआई आमंत्रण के साथ क्लासलोडर
- 22. एंड्रॉइड एप्लिकेशन में जावा आरएमआई का उपयोग
- 23. आरएमआई NotSerializableException हालांकि यह एक दूरस्थ वस्तु
- 24. जावा आरएमआई ट्यूटोरियल - एक्सेसकंट्रोल अपवाद: एक्सेस अस्वीकार (java.io.FilePermission
- 25. वेब सेवा बनाम ईजेबी बनाम आरएमआई, फायदे और नुकसान?
- 26. कोई सुरक्षा प्रबंधक के साथ जावा आरएमआई
- 27. जावा आरएमआई में संचार सुरक्षित है?
- 28. वसंत वितरित लेनदेन आरएमआई कॉल शामिल हो संभव है?
- 29. सर्वर HttpWebRequest या WebClient
- 30. सर्वर या phpMyADMIN
क्या "localhost" के अलावा इंटरफेस पर काम करने के लिए रजिस्ट्री बनाने का कोई तरीका है? – Eagle
अद्यतन: प्रलेखन कहता है '' createRegistry '' लोकलहोस्ट पर एक रजिस्ट्री निर्यात करता है। हालांकि, रजिस्ट्री बाहरी-सामने वाले इंटरफेस से कनेक्शन स्वीकार करने में सक्षम है। – Eagle
@Eagle एक रजिस्ट्री निर्यात * स्थानीयहोस्ट में चल रहा है। इसमें कोई निहितार्थ नहीं है कि यह केवल 127.0.0.1 को सुन रहा है। – EJP