探秘RocketMQ 5.0 client端Nameserver地址更新的源码实现方式

源码版本

  • 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;
                    }
                }
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值