接下来我们看下添加重试任务的方法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
经验总结扩展阅读
- 2023年10月2日公司注册好不好 2023年农历八月十八宜公司注册吗
- 2023年10月3日是公司注册的黄道吉日吗 2023年农历八月十九公司注册吉日
- 2023年农历正月十七公司注册吉日 2023年2月7日是公司注册吉日吗
- 2023年10月4日公司注册行吗 2023年10月4日是公司注册吉日吗
- 驱动开发:内核枚举Registry注册表回调
- 2023年10月5日公司注册黄道吉日 2023年10月5日是公司注册的黄道吉日吗
- 2023年2月8日是公司注册的黄道吉日吗 2023年2月8日公司注册黄道吉日
- 2023年10月6日公司注册黄道吉日 2023年农历八月廿二宜公司注册吗
- 2023年农历八月廿三宜公司注册吗 2023年10月7日公司注册吉日一览表
- 2023年农历八月廿四宜公司注册吗 2023年10月8日公司注册黄道吉日