Failback如果调用失败,则会定期重试。FailbackClusterInvoker里面定义了一个ConcurrentHashMap,专门用来保存失败的调用。定外定义了一个线程池,默认每5秒把所有失败的调用拿出来,重试一次。如果调用重试成功,则会从ConcurrentHashMap中移除,doInvoke的调用逻辑如下:
1.首先校验传入的参数。校验从AbstractClusterInvoker传入的Invoker列表是否为空。
2.负载均衡
调用select方法做负载均衡,得到要调用的节点。
3.远程调用。在try代码块中调用invoker#invoke方法做远程调用,catch到异常后直接把invocation保存到重试的ConcurrentHashMap中,并返回一个空的结果集。
4.定时线程池会定时把ConcurrentHashMap中的失败请求拿出来重新请求,请求成功则从ConcurrentHashMap中移除。如果请求还是失败,则异常也会被catch,不会影响后面的调用的重试
void retryFailed(){
if(failed.size()==0){
//没有失败的请求,直接退出
return;
}
for(Map.Entry<Invocation,AbstractClusterInvoker<?>> entry:new HashMap<Invocation,AbstractClusterInvoker<?>>(failed).entrySet()){
Invocation invocation = entry.getKey();
Invoker<?> invoker = entry.getValue();
try{
invoker.invoke(invocation);
failed.remove(invocation);
}catch(Throwable e){
...
}
}
}