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

问题

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

代码分析

dubbo默认的集群方式是failover,看FailoverClusterInvoker的代码,重试次数在这部分代码:
 在这里插入图片描述

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

但为什么我们手动指定retries=0,还是会重试呢?这个可以看看com.alibaba.dubbo.common.URL.getMethodParameter方法:
 在这里插入图片描述

可以发现,当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”)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值