Hi all,
I had encountered this problem,In fact,the implementation of RMI references is 
simple,it lacked the capacity to respond to some exception.The Spring rmi 
client is a good job(org\springframework\remoting\rmi\RmiProxyFactoryBean,you 
can find more details in class RmiClientInterceptor),it provides a 
refreshStubOnConnectFailure property,that indicate  whether to refresh the RMI 
stub on connect failure. (If a cached RMI stub throws an RMI exception that 
indicates a remote connect failure, a fresh proxy will be fetched and the 
invocation will be retried.) The lookupStubOnStartup and cacheStub are also 
helpful properties,you can learn more from the spring source code.

Need of special note is if we use the spring rmi client to connect the rim 
service that is exposed by Tuscany RMI Service,although,the property 
refreshStubOnConnectFailure of RmiProxyFactoryBean class set to be true,we will 
still encounter an exception.
You should modify  invoke method of the RmiClientInterceptor class to do with 
UndeclaredThrowableException,
Details is :

public Object invoke(MethodInvocation invocation) throws Throwable {
Remote stub = getStub();
try {
return doInvoke(invocation, stub);
} catch (RemoteConnectFailureException ex) {
return handleRemoteConnectFailure(invocation, ex);
} catch (RemoteException ex) {
if (isConnectFailure(ex)) {
return handleRemoteConnectFailure(invocation, ex);
} else {
throw ex;
}
} catch (UndeclaredThrowableException ex) {// 
return handleRemoteConnectFailure(invocation, ex);
}
}

The tuscany rmi service and reference may some improvement,Spring related 
implementation is a good reference .Thank you 
2011-03-16 



fzhong 



发件人: Millies, Sebastian 
发送时间: 2011-03-15  20:43:34 
收件人: user@tuscany.apache.org 
抄送: 
主题: Tuscany 1.6 RMI bug: ConnectException after component restart 
 
Hello there,
I believe the following is a bug in the Tuscany 1.6 RMI binding:
When I have a network of components connected by RMI references, 
then restarting a component will cause a java.net.ConnectException
in all dependent components on the next remote method call.
I suspect some kind of connection factory caches out-of-date information.
If it's a bug, it's a serious one, because it goes right against one main
reason for using distributed components in the first place.
Example:
ServerComponent exposes service "Server" with an RMI binding on port 8777.
ClientComponent exposes service "Client" with an RMI binding on port 8666
and has a reference to the service "Server".
Tester is a non-SCA Java class that exercises the Client service over RMI.
Everything works fine until the ServerComponent Java process is stopped
and re-started. The tester will then fail, because the client cannot
re-establish the connection to the server.
I have attached a zip-file with the example. Steps to reproduce the problem:
Run ServerLauncher
Run ClientLauncher
Run ClientTest
Stop process in which server is running
Re-Run ServerLauncher
Re-Run ClientTest
Has anyone else encountered this? Is it really a bug in Tuscany or in some
other component? Is there a workaround? Should I open a JIRA?
-- Sebastian

Reply via email to