DUBBO-43 invoke之前判空
git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@214 1a56cb94-b969-4eaa-88fa-be21384802f2
This commit is contained in:
parent
07b35d2b37
commit
16decc701b
|
|
@ -25,9 +25,11 @@ import java.util.concurrent.ScheduledExecutorService;
|
|||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.alibaba.dubbo.common.Version;
|
||||
import com.alibaba.dubbo.common.logger.Logger;
|
||||
import com.alibaba.dubbo.common.logger.LoggerFactory;
|
||||
import com.alibaba.dubbo.common.utils.NamedThreadFactory;
|
||||
import com.alibaba.dubbo.common.utils.NetUtils;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
|
|
@ -37,7 +39,7 @@ import com.alibaba.dubbo.rpc.cluster.Directory;
|
|||
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
|
||||
|
||||
/**
|
||||
* FailBackClusterInvoker.java
|
||||
* 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作。
|
||||
*
|
||||
* @author tony.chenl
|
||||
*/
|
||||
|
|
@ -99,8 +101,10 @@ public class FailbackClusterInvoker<T> extends AbstractClusterInvoker<T> {
|
|||
}
|
||||
|
||||
protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
|
||||
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
|
||||
try {
|
||||
if (invokers == null || invokers.size() == 0)
|
||||
throw new RpcException("No provider available for service " + getInterface().getName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", Please check whether the service do exist or version is right firstly, and check the provider has started.");
|
||||
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
|
||||
return invoker.invoke(invocation);
|
||||
} catch (Throwable e) {
|
||||
logger.error("Failback to invoke " + invocation + ", wait for retry in background. Ignored exception: "
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ public class FailfastClusterInvoker<T> extends AbstractClusterInvoker<T>{
|
|||
}
|
||||
|
||||
public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
|
||||
|
||||
if (invokers == null || invokers.size() == 0)
|
||||
throw new RpcException("No provider available for service " + getInterface().getName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", Please check whether the service do exist or version is right firstly, and check the provider has started.");
|
||||
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
|
||||
try {
|
||||
return invoker.invoke(invocation);
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ package com.alibaba.dubbo.rpc.cluster.support;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.dubbo.common.Version;
|
||||
import com.alibaba.dubbo.common.logger.Logger;
|
||||
import com.alibaba.dubbo.common.logger.LoggerFactory;
|
||||
import com.alibaba.dubbo.common.utils.NetUtils;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
|
|
@ -42,8 +44,10 @@ public class FailsafeClusterInvoker<T> extends AbstractClusterInvoker<T>{
|
|||
}
|
||||
|
||||
public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
|
||||
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
|
||||
try {
|
||||
try {
|
||||
if (invokers == null || invokers.size() == 0)
|
||||
throw new RpcException("No provider available for service " + getInterface().getName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", Please check whether the service do exist or version is right firstly, and check the provider has started.");
|
||||
Invoker<T> invoker = select(loadbalance, invocation, invokers, null);
|
||||
return invoker.invoke(invocation);
|
||||
} catch (Throwable e) {
|
||||
logger.error("Failsafe ignore exception: " + e.getMessage(), e);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ import java.util.concurrent.TimeUnit;
|
|||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import com.alibaba.dubbo.common.Constants;
|
||||
import com.alibaba.dubbo.common.Version;
|
||||
import com.alibaba.dubbo.common.utils.NamedThreadFactory;
|
||||
import com.alibaba.dubbo.common.utils.NetUtils;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
|
|
@ -47,7 +49,9 @@ public class ForkingClusterInvoker<T> extends AbstractClusterInvoker<T>{
|
|||
|
||||
private final ExecutorService executor = Executors.newCachedThreadPool(new NamedThreadFactory("forking-cluster-timer", true));
|
||||
|
||||
public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
|
||||
public Result doInvoke(final Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
|
||||
if (invokers == null || invokers.size() == 0)
|
||||
throw new RpcException("No provider available for service " + getInterface().getName() + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", Please check whether the service do exist or version is right firstly, and check the provider has started.");
|
||||
final List<Invoker<T>> selected;
|
||||
final int forks = getUrl().getParameter(Constants.FORKS_KEY, Constants.DEFAULT_FORKS);
|
||||
final int timeout = getUrl().getParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
|
||||
|
|
|
|||
|
|
@ -15,31 +15,31 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.ExtensionLoader;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcConstants;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.ExtensionLoader;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcConstants;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;
|
||||
import com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance;
|
||||
|
||||
/**
|
||||
* AbstractClusterInvokerTest
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -26,6 +28,7 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.utils.LogUtil;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
|
|
@ -105,5 +108,26 @@ public class FailSafeClusterInvokerTest {
|
|||
Result ret = invoker.invoke(invocation);
|
||||
Assert.assertSame(result, ret);
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testNoInvoke() {
|
||||
dic = EasyMock.createMock(Directory.class);
|
||||
invocation = EasyMock.createMock(Invocation.class);
|
||||
|
||||
EasyMock.expect(dic.getUrl()).andReturn(url).anyTimes();
|
||||
EasyMock.expect(dic.list(invocation)).andReturn(null).anyTimes();
|
||||
EasyMock.expect(dic.getInterface()).andReturn(DemoService.class).anyTimes();
|
||||
|
||||
EasyMock.expect(invocation.getMethodName()).andReturn("method1").anyTimes();
|
||||
EasyMock.replay(dic,invocation);
|
||||
|
||||
resetInvokerToNoException();
|
||||
|
||||
FailsafeClusterInvoker<DemoService> invoker = new FailsafeClusterInvoker<DemoService>(dic);
|
||||
LogUtil.start();
|
||||
invoker.invoke(invocation);
|
||||
assertEquals(1,LogUtil.findMessage("No provider"));
|
||||
LogUtil.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -26,6 +28,7 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.utils.LogUtil;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
|
|
@ -110,6 +113,30 @@ public class FailbackClusterInvokerTest {
|
|||
Assert.assertSame(result, ret);
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testNoInvoke() {
|
||||
dic = EasyMock.createMock(Directory.class);
|
||||
invocation = EasyMock.createMock(Invocation.class);
|
||||
|
||||
EasyMock.expect(dic.getUrl()).andReturn(url).anyTimes();
|
||||
EasyMock.expect(dic.list(invocation)).andReturn(null).anyTimes();
|
||||
EasyMock.expect(dic.getInterface()).andReturn(FailbackClusterInvokerTest.class).anyTimes();
|
||||
|
||||
EasyMock.expect(invocation.getMethodName()).andReturn("method1").anyTimes();
|
||||
EasyMock.replay(dic, invocation);
|
||||
|
||||
invokers.add(invoker);
|
||||
|
||||
resetInvokerToNoException();
|
||||
|
||||
FailbackClusterInvoker<FailbackClusterInvokerTest> invoker = new FailbackClusterInvoker<FailbackClusterInvokerTest>(
|
||||
dic);
|
||||
LogUtil.start();
|
||||
invoker.invoke(invocation);
|
||||
assertEquals(1, LogUtil.findMessage("Failback to invoke"));
|
||||
LogUtil.stop();
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testRetryFailed() {
|
||||
|
||||
|
|
@ -122,4 +149,4 @@ public class FailbackClusterInvokerTest {
|
|||
invoker.retryFailed();// when retry the invoker which get from failed map already is not the mocked invoker,so
|
||||
// it can be invoke successfully
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,24 +15,26 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcContext;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.RpcResult;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
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.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcContext;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.RpcResult;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
|
||||
/**
|
||||
* FailfastClusterInvokerTest
|
||||
|
|
@ -103,6 +105,31 @@ public class FailfastClusterInvokerTest {
|
|||
FailfastClusterInvoker<FailfastClusterInvokerTest> invoker = new FailfastClusterInvoker<FailfastClusterInvokerTest>(dic);
|
||||
Result ret = invoker.invoke(invocation);
|
||||
Assert.assertSame(result, ret);
|
||||
}
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testNoInvoke() {
|
||||
dic = EasyMock.createMock(Directory.class);
|
||||
invocation = EasyMock.createMock(Invocation.class);
|
||||
|
||||
EasyMock.expect(dic.getUrl()).andReturn(url).anyTimes();
|
||||
EasyMock.expect(dic.list(invocation)).andReturn(null).anyTimes();
|
||||
EasyMock.expect(dic.getInterface()).andReturn(FailfastClusterInvokerTest.class).anyTimes();
|
||||
|
||||
EasyMock.expect(invocation.getMethodName()).andReturn("method1").anyTimes();
|
||||
EasyMock.replay(dic,invocation);
|
||||
|
||||
invokers.add(invoker1);
|
||||
|
||||
resetInvoker1ToNoException();
|
||||
|
||||
FailfastClusterInvoker<FailfastClusterInvokerTest> invoker = new FailfastClusterInvoker<FailfastClusterInvokerTest>(dic);
|
||||
try {
|
||||
invoker.invoke(invocation);
|
||||
fail();
|
||||
} catch (RpcException expected) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -15,22 +15,24 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.RpcResult;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
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;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.RpcResult;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
|
||||
/**
|
||||
* FailoverClusterInvokerTest
|
||||
|
|
@ -138,5 +140,29 @@ public class FailoverClusterInvokerTest {
|
|||
System.out.println(e.getMessage());
|
||||
Assert.assertTrue(e.getMessage().indexOf((retries+1)+" times")>0);
|
||||
}
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testNoInvoke() {
|
||||
dic = EasyMock.createMock(Directory.class);
|
||||
invocation = EasyMock.createMock(Invocation.class);
|
||||
|
||||
EasyMock.expect(dic.getUrl()).andReturn(url).anyTimes();
|
||||
EasyMock.expect(dic.list(invocation)).andReturn(null).anyTimes();
|
||||
EasyMock.expect(dic.getInterface()).andReturn(FailoverClusterInvokerTest.class).anyTimes();
|
||||
|
||||
EasyMock.expect(invocation.getMethodName()).andReturn("method1").anyTimes();
|
||||
EasyMock.replay(dic,invocation);
|
||||
|
||||
invokers.add(invoker1);
|
||||
|
||||
|
||||
FailoverClusterInvoker<FailoverClusterInvokerTest> invoker = new FailoverClusterInvoker<FailoverClusterInvokerTest>(dic);
|
||||
try {
|
||||
invoker.invoke(invocation);
|
||||
fail();
|
||||
} catch (RpcException expected) {
|
||||
expected.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package com.alibaba.dubbo.rpc.cluster.support;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -29,7 +31,7 @@ import com.alibaba.dubbo.common.URL;
|
|||
import com.alibaba.dubbo.rpc.Invocation;
|
||||
import com.alibaba.dubbo.rpc.Invoker;
|
||||
import com.alibaba.dubbo.rpc.Result;
|
||||
import com.alibaba.dubbo.rpc.RpcContext;
|
||||
import com.alibaba.dubbo.rpc.RpcException;
|
||||
import com.alibaba.dubbo.rpc.RpcResult;
|
||||
import com.alibaba.dubbo.rpc.cluster.Directory;
|
||||
|
||||
|
|
@ -140,4 +142,27 @@ public class ForkingClusterInvokerTest {
|
|||
Result ret = invoker.invoke(invocation);
|
||||
Assert.assertSame(result, ret);
|
||||
}
|
||||
|
||||
@Test()
|
||||
public void testNoInvoke() {
|
||||
dic = EasyMock.createMock(Directory.class);
|
||||
invocation = EasyMock.createMock(Invocation.class);
|
||||
|
||||
EasyMock.expect(dic.getUrl()).andReturn(url).anyTimes();
|
||||
EasyMock.expect(dic.list(invocation)).andReturn(null).anyTimes();
|
||||
EasyMock.expect(dic.getInterface()).andReturn(ForkingClusterInvokerTest.class).anyTimes();
|
||||
|
||||
EasyMock.expect(invocation.getMethodName()).andReturn("method1").anyTimes();
|
||||
EasyMock.replay(dic, invocation);
|
||||
|
||||
resetInvokerToNoException();
|
||||
|
||||
ForkingClusterInvoker<ForkingClusterInvokerTest> invoker = new ForkingClusterInvoker<ForkingClusterInvokerTest>(
|
||||
dic);
|
||||
try {
|
||||
invoker.invoke(invocation);
|
||||
} catch (RpcException expected) {
|
||||
assertTrue(expected.getMessage().contains("No provider"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,13 +16,13 @@
|
|||
-->
|
||||
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
|
||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
|
||||
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
|
||||
<appender name="DUBBO" class="com.alibaba.dubbo.common.utils.DubboAppender">
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n" />
|
||||
</layout>
|
||||
</appender>
|
||||
<root>
|
||||
<level value="INFO" />
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="DUBBO" />
|
||||
</root>
|
||||
</log4j:configuration>
|
||||
Loading…
Reference in New Issue