成功启动后,Spring RmiExporter服务失败

时间:2013-07-31 16:16:29

标签: java spring rmi lsof

我遇到这样一种情况:使用Spring的RmiServiceExporter配置的RMI服务正常启动并且可以使用一段时间 - 然后在一段未知的时间之后,即使是java,该服务也不可用该Spring上下文的进程仍在运行。

目前,解决方法是重启java进程,但这在生产环境中几乎不可接受。我无法弄清楚,甚至开始猜测为什么会发生这种情况,或者寻找可能出错的地方。没有S / O或谷歌搜索是有用的,因为我找到的只是RmiServiceExporter根本没有启动的例子,没有开始好然后再失败。任何线索都是有用的。

在服务失败之前lsof | head -1;lsof | grep 1197输出

COMMAND     PID       USER   FD      TYPE             DEVICE SIZE/OFF      NODE NAME
java       6882     ubuntu  176u     IPv6           54677985      0t0       TCP *:1197 (LISTEN)

服务端Spring配置:

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="MyRmiService" />
    <property name="service" ref="myService" />
    <property name="serviceInterface" value="package.MyService" />
    <property name="registryPort" value="${my.rmi.port}" />
</bean>

客户端Spring配置:

<bean id="remoteService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://${my.rmi.host}:${my.rmi.port}/MyRmiService"/>
    <property name="serviceInterface" value="package.MyService"/>
    <property name="lookupStubOnStartup" value="false"/>
    <property name="refreshStubOnConnectFailure" value="true"/>
</bean>

客户端堆栈跟踪, 服务失败后(lsof没有报告):

Exception in thread "main" org.springframework.remoting.RemoteLookupFailureException: Lookup of RMI stub failed; nested exception is java.rmi.ConnectException: Connection refused to host: rmiservice.host; nested exception is: 
    java.net.ConnectException: Connection refused
    at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:215)
    at org.springframework.remoting.rmi.RmiClientInterceptor.getStub(RmiClientInterceptor.java:237)
    at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:257)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy61.serviceMethod(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:191)
    at package.Client.main(Client.java:47)
Caused by: java.rmi.ConnectException: Connection refused to host: rmiservice.host; nested exception is: 
    java.net.ConnectException: Connection refused
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:84)
    at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:200)
    ... 11 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
    ... 17 more

1 个答案:

答案 0 :(得分:0)

您使用的是哪个网络服务器?

如果是Apache Tomcat,则添加到CATALINA_OPTS变量

-Djava.rmi.server.hostname=10.0.34.11

catalina.sh文件中,然后导出CATALINA_OPTS变量。