2008-09-19 10 views

Respuesta

7

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.

+0

¿Hay alguna manera de que createRegistry funcione en una interfaz además de "localhost"? – Eagle

+0

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

+0

@Eagle Exports a Registry * ejecutándose en * el localhost. No hay implicación de que solo esté escuchando 127.0.0.1. – EJP

0

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

+0

Falso y desmotivado. También puede usar LocateRegistry en un programa independiente. – EJP

0

Si usa Spring para exportar sus servicios de RMI, automáticamente inicia un registro si no se está ejecutando uno. Ver RmiServiceExporter

+0

¿Puedes editar esto para incluir un enlace a la documentación de esta función? –

4

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.