RMI сервер: rmiregistry или LocateRegistry.createRegistry

Для RMI на стороне сервера, мы должны начатьrmiregistry программа, или просто позвонитеLocateRegistry.createRegistry? Если оба варианта возможны, каковы преимущества и недостатки?

Ответы на вопрос(4)

он автоматически запускает реестр, если он еще не запущен. ВидетьRmiServiceExporter

 Nathan Feger18 мар. 2009 г., 18:53
Вы можете отредактировать это, чтобы включить ссылку на документацию для этой функции?

вы захотите запустить свое собственное rmiregistry, но если вы пишете J2EE-приложение, которое, очевидно, работает в контейнере J2EE, то вы хотите «LocateRegistry», так как оно уже запущено на сервере приложений!

 user20742103 янв. 2018 г., 17:57
Неверно и немотивировано. Возможно, вы захотите использовать LocateRegistry и в отдельной программе.
Решение Вопроса

rmiregistry это отдельная программа, которую вы можете запустить из командной строки или скрипта, аLocateRegistry.createRegistry делает то же самое программно.

По моему опыту, для «настоящих» серверов вы захотите использоватьrmiregistry так что вы знаете, что он всегда работает независимо от того, запущено клиентское приложение или нет.createRegistry Это очень полезно для тестирования, так как вы можете запускать и останавливать реестр при необходимости.

 user20742105 июл. 2017 г., 05:28
@Eagle экспортирует реестрработает в местный хост. Не подразумевается, что он слушает только 127.0.0.1.
 Eagle02 мая 2013 г., 23:16
Есть ли способ для createRegistry работать на интерфейсе, кроме "localhost"?
 Eagle06 мая 2013 г., 16:39
Обновление: документация говорит, что '' createRegistry '' экспортирует реестр на Localhost. Однако Реестр может принимать соединения и от внешних интерфейсов.

RmiServiceExporter зарегистрирует себя в запущенном rmiregistry. В этом случае мы должны установить системное свойство 'java.rmi.server.codebase', чтобы найти класс 'org.springframework.remoting.rmi.RmiInvocationWrapper_Stub'. В противном случае RmiServiceExporter не будет запущен и получит исключение «Класс ClassNotFoundException не найден: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; вложенное исключение: ...»

Если ваш rmi-сервер, rmi-клиент и rmiregistry могут обращаться к одной и той же файловой системе, вы можете автоматически настроить системное свойство так, чтобы в общей файловой системе можно было найти spring.jar. Следующие служебные классы и конфигурация пружин показывают, как этого можно достичь.

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>

В приведенном выше примере показано, как автоматически настраивать системное свойство, только если сервер rmi, клиент rmi и реестр rmi могут получить доступ к одной и той же файловой системе. Если это не так или кодовая база Spring передается другим способом (например, HTTP), вы можете изменить CodeBaseResolver в соответствии с вашими потребностями.

Ваш ответ на вопрос