2009-09-25 11 views
11

Tôi có máy chủ RMI và máy khách RMI trên máy tính để bàn. Khi tôi khởi động lại máy chủ, tôi gặp lỗi trong ứng dụng khách. Có thể khởi động lại kết nối RMI mà không cần khởi động lại máy khách không?Kết nối lại máy khách RMI sau khi máy chủ khởi động lại

[EDIT] Đây là stacktrace:

java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at ...user code... 
Caused by: java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) 
    at $Proxy0.search(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:592) 
    at org.springframework.remoting.rmi.RmiClientInterceptorUtils.invokeRemoteMethod(RmiClientInterceptorUtils.java:108) 
    at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:362) 
    at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:258) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy1.search(Unknown Source) 
    ... 3 more 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:367) 
    at java.net.Socket.connect(Socket.java:524) 
    at java.net.Socket.connect(Socket.java:474) 
    at java.net.Socket.<init>(Socket.java:371) 
    at java.net.Socket.<init>(Socket.java:184) 
    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:569) 
    ... 20 more 
+0

bạn sắp nhận được loại lỗi nào? – akf

Trả lời

5

Khi máy chủ bị chấm dứt, bạn sẽ nhận được một ConnectException. Sau đó, bạn chỉ có thể sử dụng Naming.lookup để lấy đối tượng máy chủ mới.

+0

Nếu máy chủ đã khởi động lại, bạn có thể nhận được 'NoSuchObjectException' thay thế. – EJP

20

Nếu bạn đang sử dụng Spring (cụ thể là RmiProxyFactoryBean), bạn có thể chỉ cần đặt thuộc tính refreshStubOnConnectFailure thành true và bean sẽ tồn tại khi khởi động lại máy chủ.

<property name="refreshStubOnConnectFailure" value="true" /> 
+0

Cảm ơn nhận xét của bạn. Đó là thời gian tiết kiệm cho tôi – firstthumb

+1

Tôi đã sử dụng mùa xuân. điều này đã giúp tôi. – DragonFax

+1

rực rỡ, một lời cảm ơn lớn cho cả mùa xuân và bản thân bạn cho câu trả lời :) – James