Dla RMI po stronie serwera, czy musimy uruchomić program rmiregistry
, czy po prostu zadzwonić pod numer LocateRegistry.createRegistry
? Jeśli obie są możliwe, jakie są zalety i wady?Serwer RMI: rmiregistry lub LocateRegistry.createRegistry
Odpowiedz
To jedna rzecz ... rmiregistry
to osobny program, który można uruchomić z wiersza poleceń lub skryptu, podczas gdy LocateRegistry.createRegistry
robi to samo programowo.
Z mojego doświadczenia wynika, że w przypadku "prawdziwych" serwerów należy używać rmiregistry
, aby wiedzieć, że zawsze działa niezależnie od tego, czy aplikacja kliencka jest uruchamiana, czy nie. createRegistry
jest bardzo przydatny do testowania, ponieważ możesz w razie potrzeby uruchomić i zatrzymać rejestr z testu.
Jeśli piszesz samodzielną aplikację java, powinieneś zacząć swoją własną bibliotekę, ale jeśli piszesz aplikację J2EE, która oczywiście działa wewnątrz kontenera J2EE, to chcesz "LocateRegistry", ponieważ jest już uruchomiona na serwer aplikacji!
Niezaufany i nieumotywowany. Możesz również użyć LocateRegistry w samodzielnym programie. – EJP
Jeśli używasz Spring do eksportowania usług RMI, automatycznie uruchamia rejestr, jeśli jeszcze nie jest uruchomiony. Zobacz RmiServiceExporter
Czy możesz to edytować, dodając link do dokumentacji tej funkcji? –
Jeśli zaczniemy od pierwszej rmiregistry, RmiServiceExporter zarejestruje się w bieżącej rmiregistry. W tym przypadku musimy ustawić właściwość systemową "java.rmi.server.codebase", gdzie znajduje się klasa "org.springframework.remoting.rmi.RmiInvocationWrapper_Stub". W przeciwnym razie, RmiServiceExporter nie będzie uruchomiony i dostał wyjątek „ klasa ClassNotFoundException nie znaleziono: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; wyjątek zagnieżdżonych jest: ...”
Jeśli serwer RMI, klient RMI i rmiregistry może uzyskać dostęp do tego samego systemu plików, możesz chcieć, aby właściwość systemowa była automatycznie konfigurowana do miejsca, w którym plik spring.jar znajduje się w udostępnionym systemie plików. Poniższe klasy narzędzi i konfiguracja sprężyn pokazują, w jaki sposób można to osiągnąć.
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>
Powyższy przykład pokazuje, jak właściwość systemu można ustawić automatycznie tylko wtedy, gdy serwer RMI, klient RMI i rejestru RMI może dostęp do tego samego systemu plików. Jeśli to nie jest prawda lub baza kodów źródłowych Spring jest udostępniana za pomocą innej metody (np. HTTP), możesz zmodyfikować CodeBaseResolver zgodnie ze swoimi potrzebami.
- 1. Serwer RMI sam się wyłącza
- 2. Java: Gniazda lub RMI?
- 3. Java RMI NoClassDefFoundError dla javax.json.JsonValue Zdalny obiekt
- 4. połączenie RMI odmówił z localhost
- 5. Jak zdalnie zamykania systemu jest serwer Java RMI
- 6. RMI vs usługa REST
- 7. Java RMI śledzenie
- 8. Java RMI bez menedżera zabezpieczeń
- 9. Używanie JAVA RMI w aplikacji Android
- 10. transfer plików za pomocą RMI
- 11. Proste wywołanie zwrotne RMI Przykład
- 12. rmi vs servlets vs gniazda
- 13. Ponownie połącz klienta RMI po restarcie serwera
- 14. Określanie zdalnego adresu IP klienta dla wywołania Java RMI
- 15. Ustawianie tożsamość lub wyłączyć serwer SQL
- 16. Gdzie należy sortować dane? Serwer lub klient?
- 17. Serwer Google dla Webfont lub hostowany samodzielnie?
- 18. Serwer IMAP lub POP3 zaimplementowany w PHP
- 19. Biblioteka strumieniowania HTTP IP/iPhone'a lub serwer
- 20. Serwer SQL został połączony z operatorem "Lub"
- 21. Jaka jest różnica między RMI i Corba?
- 22. Jak zaimplementować wzorzec Obserwatora za pomocą Java RMI?
- 23. Jak używać RMI z apletem klienta za firewallem?
- 24. Wyjątek RMI NotSerializableException, chociaż jest to obiekt zdalny
- 25. Czy Play Framework może działać jako serwer proxy lub serwer proxy?
- 26. serwer Web otrzymał niepoprawną odpowiedź działając jako brama lub serwer proxy
- 27. VisualVM przez zapory sieciowe - rozwiązywanie problemów z RMI
- 28. Serwer rozwoju testów wytrzymałościowych/serwer produkcyjny
- 29. Serwer EC2, dużo mikro instancji lub mniejszych instancji?
- 30. Jak znaleźć serwer proxy jest Http lub skarpetki
Czy istnieje sposób, aby createRegistry działało na interfejsie oprócz "localhost"? – Eagle
Aktualizacja: Dokumentacja mówi, że '' createRegistry '' eksportuje rejestr na Localhost. Rejestr może również akceptować połączenia z interfejsów skierowanych na zewnątrz. – Eagle
@Eagle Eksportuje rejestr * działający w * localhost. Nie ma żadnej sugestii, że słucha się tylko 127.0.0.1. – EJP