diff --git a/dubbo-cluster/src/main/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvoker.java b/dubbo-cluster/src/main/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvoker.java index c224a11e2d..e08e51a5b7 100644 --- a/dubbo-cluster/src/main/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvoker.java +++ b/dubbo-cluster/src/main/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvoker.java @@ -53,7 +53,7 @@ public class FailoverClusterInvoker extends AbstractClusterInvoker{ len = 1; // retry loop. - Throwable le = null; // last exception. + RpcException le = null; // last exception. List> invoked = new ArrayList>(invokers.size()); // invoked invokers. Set providers = new HashSet(len); for (int i = 0; i < len; i++) { @@ -81,6 +81,6 @@ public class FailoverClusterInvoker extends AbstractClusterInvoker{ if(invoker != null ) urls.add(invoker.getUrl()); } - throw new RpcException("Tried " + len + " times to invoke providers " + providers + " " + loadbalance.getClass().getAnnotation(Extension.class).value() + " select from all providers " + invokers + " for service " + getInterface().getName() + " method " + invocation.getMethodName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", but no luck to perform the invocation. Last error is: " + (le != null ? le.getMessage() : ""), le); + throw new RpcException(le.getCode(),"Tried " + len + " times to invoke providers " + providers + " " + loadbalance.getClass().getAnnotation(Extension.class).value() + " select from all providers " + invokers + " for service " + getInterface().getName() + " method " + invocation.getMethodName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", but no luck to perform the invocation. Last error is: " + (le != null ? le.getMessage() : ""), le); } } \ No newline at end of file diff --git a/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvokerTest.java b/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvokerTest.java index 9abe8fb836..706e5542b1 100644 --- a/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvokerTest.java +++ b/dubbo-cluster/src/test/java/com/alibaba/dubbo/rpc/cluster/support/FailoverClusterInvokerTest.java @@ -15,13 +15,14 @@ */ package com.alibaba.dubbo.rpc.cluster.support; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; -import junit.framework.Assert; - import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; @@ -71,8 +72,8 @@ public class FailoverClusterInvokerTest { } - @Test(expected = RpcException.class) - public void testInvokeWithBizException() { + @Test + public void testInvokeWithRuntimeException() { EasyMock.reset(invoker1); EasyMock.expect(invoker1.invoke(invocation)).andThrow(new RuntimeException()).anyTimes(); EasyMock.expect(invoker1.isAvailable()).andReturn(true).anyTimes(); @@ -88,7 +89,12 @@ public class FailoverClusterInvokerTest { EasyMock.replay(invoker2); FailoverClusterInvoker invoker = new FailoverClusterInvoker(dic); - invoker.invoke(invocation); + try { + invoker.invoke(invocation); + fail(); + } catch (RpcException expected) { + assertEquals(0,expected.getCode()); + } } @Test() @@ -111,7 +117,7 @@ public class FailoverClusterInvokerTest { FailoverClusterInvoker invoker = new FailoverClusterInvoker(dic); for(int i=0;i<100;i++){ Result ret = invoker.invoke(invocation); - Assert.assertSame(result, ret); + assertSame(result, ret); } } @@ -119,7 +125,7 @@ public class FailoverClusterInvokerTest { public void testInvoke_retryTimes() { EasyMock.reset(invoker1); - EasyMock.expect(invoker1.invoke(invocation)).andThrow(new RpcException()).anyTimes(); + EasyMock.expect(invoker1.invoke(invocation)).andThrow(new RpcException(RpcException.TIMEOUT_EXCEPTION)).anyTimes(); EasyMock.expect(invoker1.isAvailable()).andReturn(false).anyTimes(); EasyMock.expect(invoker1.getUrl()).andReturn(url).anyTimes(); EasyMock.expect(invoker1.getInterface()).andReturn(FailoverClusterInvokerTest.class).anyTimes(); @@ -135,10 +141,11 @@ public class FailoverClusterInvokerTest { FailoverClusterInvoker invoker = new FailoverClusterInvoker(dic); try{ Result ret = invoker.invoke(invocation); - Assert.assertSame(result, ret); - }catch (RpcException e) { - System.out.println(e.getMessage()); - Assert.assertTrue(e.getMessage().indexOf((retries+1)+" times")>0); + assertSame(result, ret); + fail(); + }catch (RpcException expected) { + assertTrue(expected.isTimeout()); + assertTrue(expected.getMessage().indexOf((retries+1)+" times")>0); } }