Как настроить адрес конечной точки экспортера службы rmi?

Я экспортировал некоторые услуги RMI.

 <bean id="entityRmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="entityService"/>
    <property name="service" ref="entityServiceImpl"/>
    <property name="serviceInterface" value="IEntityService"/>
    <property name="registryPort" value="1099"/>
</bean>

При запуске на моей машине конечной точкой является 127.0.0.1:1099, а на виртуальной машине - 10.0.2.15:1099, IP-адрес.

RmiServiceExporter:276 - Binding service 'entityService' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[127.0.0.1:1099](local),objID:[0:0:0, 0]]]]

где я могу настроить его вручную?

1 ответ

Решение

Вы можете использовать заполнители в конфигурации Spring и перемещать определенные значения в файл свойств. Для этого вам сначала понадобится компонент, который разрешит свойства из файла:

<!-- Read file that contains properties -->
<bean id="properties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:app.properties" />
</bean>

Далее вы можете изменить свой entityRmiServiceExporter bean для использования значений из этого файла:

<bean id="entityRmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="entityService"/>
    <property name="service" ref="entityServiceImpl"/>
    <property name="serviceInterface" value="IEntityService"/>
    <property name="registryPort" value="1099"/>

    <property name="registryHost" value="${rmi.endpoint}"/>
</bean>

И вам нужен файл app.properties с такой строкой:

rmi.endpoint=10.0.2.15

Альтернативный подход

Согласно Javadoc RmiServiceExporter, может быть альтернативный подход. Этот Javadoc говорит:

Примечание. RMI делает все возможное, чтобы получить полное имя хоста. Если не удается определить, он будет использовать и использовать IP-адрес. В зависимости от конфигурации вашей сети, в некоторых случаях IP-адрес будет преобразован в адрес обратной связи.

Вы можете сказать RMI, что такое имя хоста машины, передав -Djava.rmi.server.hostname=server.mycompany.com к вашей JVM, когда он запущен.

Это означает, что вам не нужно настраивать ваш bean-компонент Spring - вместо этого вы настраиваете JVM для предоставления интерфейсов RMI на другом интерфейсе. Если бы ваша машина была напрямую подключена к Интернету (т.е. без брандмауэра или чего-то промежуточного), я бы этого не сделал. Если машина находится внутри корпоративной сети, это может быть приемлемым или даже предпочтительным, чтобы решить эту проблему таким образом.

Другие вопросы по тегам