Pregunta

Para RMI en el lado del servidor, ¿necesitamos comenzar? rmiregistry programa, o simplemente llame LocateRegistry.createRegistry?Si ambas son posibles, ¿cuáles son las ventajas y desventajas?

¿Fue útil?

Solución

Son lo mismo... rmiregistry es un programa separado, que puede ejecutar desde una línea de comando o un script, mientras LocateRegistry.createRegistry hace lo mismo programáticamente.

En mi experiencia, para servidores "reales" querrás usar rmiregistry para que sepa que siempre se está ejecutando independientemente de si la aplicación cliente está iniciada o no. createRegistry es muy útil para realizar pruebas, ya que puede iniciar y detener el registro desde la prueba según sea necesario.

Otros consejos

Si iniciamos rmiregistry primero, RmiServiceExporter se registrará en el rmiregistry en ejecución.En este caso, tenemos que establecer la propiedad del sistema 'java.rmi.server.codebase' donde se puede encontrar la clase 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub'.De lo contrario, el rmiserviceExporter no se iniciaría y obtendría la excepción "clase ClassNotFoundException no encontrada:org.springframework.remoting.rmi.RmiInvocationWrapper_Stub;La excepción anidada es:..."

Si su servidor rmi, cliente rmi y rmiregistry pueden acceder al mismo sistema de archivos, es posible que desee que la propiedad del sistema se configure automáticamente donde se puede encontrar spring.jar en el sistema de archivos compartido.Las siguientes clases de utilidad y configuración de resortes 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 las propiedades del sistema se configuran automáticamente solo cuando el servidor rmi, el cliente rmi y el registro rmi pueden acceder al mismo sistema de archivos.Si eso no es cierto o el código base de Spring se comparte a través de otro método (p. ej.HTTP), puede modificar CodeBaseResolver para adaptarlo a sus necesidades.

Si está escribiendo una aplicación Java independiente, querrá iniciar su propio rmiregistry, pero si está escribiendo una aplicación J2EE que obviamente se ejecuta dentro de un contenedor J2EE, entonces querrá "LocateRegistry", ya que ya hay una ejecutándose en el servidor de aplicaciones.

Si utiliza Spring para exportar sus servicios RMI, automáticamente inicia un registro si aún no se está ejecutando ninguno.Ver RmiServiceExportador

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top