Dubbo-聊聊注册中心的设计( 八 )

接下来我们看下添加重试任务的方法addFailedRegistered,该方法相对比较简单,核心就是将失败的任务放到容器中,然后将失败的任务加入时间轮等待执行 。
    private void addFailedRegistered(URL url) {        //判断容器中是是否存在任务        FailedRegisteredTask oldOne = failedRegistered.get(url);        if (oldOne != null) {            return;        }        //将任务添加容器中        FailedRegisteredTask newTask = new FailedRegisteredTask(url, this);        oldOne = failedRegistered.putIfAbsent(url, newTask);        if (oldOne == null) {            // never has a retry task. then start a new task for retry.            //将任务提交到时间轮中 等待retryPeriod秒后执行            retryTimer.newTimeout(newTask, retryPeriod, TimeUnit.MILLISECONDS);        }    }对于其他unregister()、subscribe()、unsubscribe() 都与register()类似这里就不做过多介绍,简单看下提供几个抽象的方法 。
    public abstract void doRegister(URL url);    public abstract void doUnregister(URL url);    public abstract void doSubscribe(URL url, NotifyListener listener);    public abstract void doUnsubscribe(URL url, NotifyListener listener);重试任务addFailedRegistered方法中创建FailedRegisteredTask以及其他重试任务,都是继承AbstractRetryTask,接下来我们要来关于AbstractRetryTask的设计和实现 。在AbstractRetryTask抽象类中,有一个核心run方法实现已经一个抽象方法,该抽象方法也是模板类作用 。
 @Override    public void run(Timeout timeout) throws Exception {        //检查定义任务状态以及时间轮状态        if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {            // other thread cancel this timeout or stop the timer.            return;        }        //检查重试次数        if (times > retryTimes) {            // reach the most times of retry.            logger.warn("Final failed to execute task " + taskName + ", url: " + url + ", retry " + retryTimes + " times.");            return;        }        if (logger.isInfoEnabled()) {            logger.info(taskName + " : " + url);        }        try {   &nb

经验总结扩展阅读