@Reference(retries=0)依然会重试2次问题分析

问题

使用@Reference 注解的时候,发现设置retries=0,还是会出现调用3次的情况,而不是我们期望的不重试。

代码分析

dubbo默认的集群方式是failover,看FailoverClusterInvoker的代码,重试次数在这部分代码:
 @Reference(retries=0)依然会重试2次问题分析_第1张图片

从这部分代码可以看出来,次数是从url的retries参数拿到的,如果拿不到就会使用Constants.DEFAULT_RETRIES=2
所以,如果@Reference没有配置retries,次数就会是2+1=3,即失败后还会重试2次。

但为什么我们手动指定retries=0,还是会重试呢?这个可以看看com.alibaba.dubbo.common.URL.getMethodParameter方法:
 @Reference(retries=0)依然会重试2次问题分析_第2张图片

可以发现,当value是null或者0的时候,都会使用默认值,所以我们配置0,实际上还是会重试2次。

为什么dubbo要判断0呢?
猜想是因为注解的属性,都是基础类型,int的默认值就是0,所以把0也判断了。

怎么才能不重试

方式一:
第一个截图里,有圈了一段代码if (len <= 0) {len = 1;}
只要计算出来的len小于等于0,len就会被设置成1,所以我们可以这样配置@Reference(retries=-1)。
-1不是null也不是0,所以不会用默认值,加1之后是0,所以len是0,经过if判断后会变成1

方式二:
还有另外一种方式,换集群,默认是failover,可以配置成failfast,@Reference(cluster = “failfast”)

你可能感兴趣的:(dubbo,java)