I'm having some trouble finding where that code is you're suggesting to change, where is that invoke method - is it a Tuscany class or a Spring - what is the class and package name?
...ant On Wed, Mar 16, 2011 at 1:44 AM, fzhong <fzh...@travelsky.com> wrote: > 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