源码版本
rocketmq:release-5.0.0
背景
上一章我们通过源码的方式详细的介绍了client如何获取Nameserver地址,今天我们就来继续研究研究client是如何更新Nameserver地址
Client如何更新本地namesrvAddr
client更新Nameserver的定时器主要是在这里启动的
this.startScheduledTask();
复制代码
我们进去这个方法看一看
如果clientConfig获取的namesrvAddr地址为空就会启动一个定时任务
其中定时任务中方法
MQClientInstance.this.mQClientAPIImpl.fetchNameServerAddr();
复制代码
就是通过我们设置的wsAddr(也就是获取namesrvAddr的url地址)地址去获取namesrvAddr地址
线程池scheduledExecutorService的初始化
privatefinalScheduledExecutorServicescheduledExecutorService= Executors.newSingleThreadScheduledExecutor(r -> newThread(r, "MQClientFactoryScheduledThread"));
复制代码
可以看到是线程池延迟1s后执行,每隔2分钟去http服务器去拉取namesrvAddr的地址
实际更新本地的namesrvAddr地址是通过updateNameServerAddressList方法
最终实际去更新的还是NettyRemotingClient中的namesrvAddrList值
@OverridepublicvoidupdateNameServerAddressList(List<String> addrs) {
List<String> old = this.namesrvAddrList.get();
booleanupdate=false;
if (!addrs.isEmpty()) {
if (null == old) {
update = true;
} elseif (addrs.size() != old.size()) {
update = true;
} else {
for (inti=0; i < addrs.size() && !update; i++) {
if (!old.contains(addrs.get(i))) {
update = true;
}
}