Question

Pour RMI côté serveur, devons-nous démarrer le programme rmiregistry ou simplement appeler LocateRegistry.createRegistry ? Si les deux sont possibles, quels sont les avantages et les inconvénients?

Était-ce utile?

La solution

C’est la même chose ... rmiregistry est un programme séparé, que vous pouvez exécuter à partir d'une ligne de commande ou d'un script, tandis que LocateRegistry.createRegistry effectue la même chose par programmation.

D'après mon expérience, pour "réel" serveurs que vous souhaitez utiliser rmiregistry pour que vous sachiez qu’il est toujours en cours d’exécution, que l’application cliente soit démarrée ou non. createRegistry est très utile pour les tests, car vous pouvez démarrer et arrêter le registre à partir de votre test si nécessaire.

Autres conseils

Si nous commençons par commencer la chimie, RmiServiceExporter s'enregistrera lui-même dans la chimie en cours. Dans ce cas, nous devons définir la propriété système 'java.rmi.server.codebase' sur la classe 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub'. Sinon, RmiServiceExporter ne serait pas démarré et aurait l'exception " ClassNotFoundException classe introuvable: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; L’exception imbriquée est: ... "

Si votre serveur rmi, votre client rmi et rmiregistry peuvent accéder au même système de fichiers, vous souhaiterez peut-être que la propriété système soit automatiquement configurée de manière à ce que le fichier spring.jar se trouve sur le système de fichiers partagé. Les classes d'utilitaires et la configuration de ressort suivantes montrent comment cela peut être réalisé.

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>

L'exemple ci-dessus montre comment la propriété système doit être définie automatiquement uniquement lorsque le serveur rmi, le client rmi et le registre rmi peuvent accéder au même système de fichiers. Si ce n'est pas le cas ou si la base de code printanière est partagée via une autre méthode (HTTP, par exemple), vous pouvez modifier CodeBaseResolver pour l'adapter à vos besoins.

Si vous écrivez une application Java autonome, vous voudriez démarrer votre propre rmiregistry, mais si vous écrivez une application J2EE qui s'exécute évidemment dans un conteneur J2EE, alors vous souhaitez "LocateRegistry". comme il en existe déjà un sur le serveur d'applications!

Si vous utilisez Spring pour exporter vos services RMI, il ouvre automatiquement un registre, s'il ne l'est pas déjà. Voir RmiServiceExporter .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top