Para RMI en el lado del servidor, ¿tenemos que iniciar el programa rmiregistry
, o simplemente llamar al LocateRegistry.createRegistry
? Si ambos son posibles, ¿cuáles son las ventajas y desventajas?Servidor RMI: rmiregistry o LocateRegistry.createRegistry
Respuesta
Son lo mismo ... rmiregistry
es un programa separado, que se puede ejecutar desde una línea de comandos o un script, mientras que LocateRegistry.createRegistry
hace lo mismo por programación.
En mi experiencia, para los servidores "reales" querrá usar rmiregistry
para que sepa que siempre se está ejecutando independientemente de si la aplicación del cliente está iniciada o no. createRegistry
es muy útil para las pruebas, ya que puede iniciar y detener el registro de su prueba según sea necesario.
Si está escribiendo una aplicación independiente de Java que se desea iniciar su propio rmiregistry pero si usted está escribiendo una aplicación J2EE que, obviamente, se ejecuta dentro de un contenedor J2EE entonces usted quiere "LocateRegistry", como ya hay uno que se ejecuta en el servidor de aplicaciones
Falso y desmotivado. También puede usar LocateRegistry en un programa independiente. – EJP
Si usa Spring para exportar sus servicios de RMI, automáticamente inicia un registro si no se está ejecutando uno. Ver RmiServiceExporter
¿Puedes editar esto para incluir un enlace a la documentación de esta función? –
Si comenzamos rmiregistry primero, RmiServiceExporter se registraría a sí mismo en ejecución rmiregistry. En este caso, debemos establecer la propiedad del sistema 'java.rmi.server.codebase' en donde se puede encontrar la clase 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub'. De lo contrario, el RmiServiceExporter no se inicia y se puso la excepción " clase ClassNotFoundException no encontrado: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; la excepción anidada es: ..."
Si el servidor RMI, RMI cliente y rmiregistry puede acceder al mismo sistema de archivos, es posible que desee que la propiedad del sistema se configure automáticamente para que se encuentre spring.jar en el sistema de archivos compartido. Las siguientes clases de utilidad y configuración de primavera muestran cómo se puede lograr esto.
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>
El ejemplo anterior muestra cómo la propiedad del sistema puede ajustar automáticamente sólo cuando el servidor RMI, RMI cliente y registro RMI pueden acceder al mismo sistema de ficheros. Si eso no es cierto o la base de código de Spring se comparte a través de otro método (por ejemplo, HTTP), puede modificar CodeBaseResolver para que se ajuste a sus necesidades.
- 1. No se puede iniciar el servidor RMI después de detenerlo
- 2. Java: tomas de corriente o RMI?
- 3. ¿Cómo cerrar rmiregistry ejecutándose en un puerto determinado?
- 4. Java RMI AccessControlException: acceso denegado
- 5. conexión rechazada en 127.0.1.1 java RMI
- 6. Cómo remotamente el cierre de un servidor Java RMI
- 7. RMI y excepciones
- 8. de conexiones para RMI negado con localhost
- 9. Mejores prácticas para aplicaciones JUnit y RMI, registro RMI
- 10. Java: RMI vs servicios web
- 11. Servicio RMI vs REST
- 12. Java RMI sin SecurityManager
- 13. Java RMI: Sniffer needed
- 14. RMI Java Rastreo
- 15. Diferencias RMI y CORBA?
- 16. Java RMI Tutorial - AccessControlException: acceso denegado (java.io.FilePermission
- 17. Java RMI - Tiempo de espera del cliente
- 18. Cambiar puerto RMI predeterminado (Java)
- 19. Head First Java - problemas de RMI
- 20. ¿Realmente necesitamos crear Stub en Java RMI?
- 21. Uso de un solo registro de RMI
- 22. C# Invocación de método remoto (RMI)
- 23. transferencia de archivos usando RMI
- 24. ¿Qué es el registro RMI
- 25. diferencia entre JMX y RMI
- 26. RMI NotSerializableException aunque es un objeto remoto
- 27. Vuelva a conectar el cliente RMI después de reiniciar el servidor
- 28. Java RMI con Scala, ¿es esto posible?
- 29. Servicios web vs EJB vs RMI, ventajas y desventajas?
- 30. VisualVM a través de firewalls: solución de problemas de RMI
¿Hay alguna manera de que createRegistry funcione en una interfaz además de "localhost"? – Eagle
Actualización: La documentación dice que '' createRegistry '' exporta un registro en Localhost. Sin embargo, el Registro también puede aceptar conexiones de interfaces externas. – Eagle
@Eagle Exports a Registry * ejecutándose en * el localhost. No hay implicación de que solo esté escuchando 127.0.0.1. – EJP