【问题标题】:How to configure rmi service exporter endpoint address?如何配置 rmi 服务导出器端点地址?
【发布时间】:2013-07-16 11:23:26
【问题描述】:

我已经导出了一些 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 但在 VM 上是 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]]]]

在哪里可以手动配置?

【问题讨论】:

    标签: java spring service rmi


    【解决方案1】:

    您可以在 Spring 配置中使用占位符并将特定值移动到属性文件中。为此,您首先需要一个 bean 来解析文件中的属性:

    <!-- 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
    

    替代方法

    根据RmiServiceExporter Javadoc,可能有另一种方法。这个 Javadoc 说:

    注意:RMI 会尽最大努力获取完全限定的主机名。如果无法确定,它将回退并使用 IP 地址。根据您的网络配置,在某些情况下,它会将 IP 解析为环回地址。

    您可以通过在启动时将 -Djava.rmi.server.hostname=server.mycompany.com 传递给您的 JVM 来告诉 RMI 机器主机名是什么。

    这意味着您不必配置 Spring bean - 相反,您可以配置 JVM 以在不同的接口上公开 RMI 接口。如果您的机器直接暴露在互联网上(即没有防火墙或介于两者之间的东西),我不会那样做。如果机器位于公司网络内,则以这种方式解决它可能是可以接受的,甚至更可取。

    【讨论】:

    • 谢谢,默认 registryHost 是 127.0.0.1 吗?为什么它在 VM 上的工作方式不同?
    • 因为虚拟机与网络堆栈的交互方式不同。它仍然是一个本地地址,因此是 10.*.*.*
    • 澄清一下,java.rmi.server.hostname 不影响绑定地址:它确定嵌入在存根中的 IP 地址或主机名。它与本地接口没有任何关系:例如,它可以是设置为进行端口转发的 NAT 设备的另一公共端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多