rocketmq源码解析默认请求处理器②

说在前面

默认请求处理器,注册broker

 

源码解析

进入这个方法,注册broker,org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#registerBrokerWithFilterServer

public RemotingCommand registerBrokerWithFilterServer(ChannelHandlerContext ctx, RemotingCommand request)        throws RemotingCommandException {        final RemotingCommand response = RemotingCommand.createResponseCommand(RegisterBrokerResponseHeader.class);        final RegisterBrokerResponseHeader responseHeader = (RegisterBrokerResponseHeader) response.readCustomHeader();        final RegisterBrokerRequestHeader requestHeader =            (RegisterBrokerRequestHeader) request.decodeCommandCustomHeader(RegisterBrokerRequestHeader.class);
        if (!checksum(ctx, request, requestHeader)) {            response.setCode(ResponseCode.SYSTEM_ERROR);            response.setRemark("crc32 not match");            return response;        }
        RegisterBrokerBody registerBrokerBody = new RegisterBrokerBody();
        if (request.getBody() != null) {            try {                registerBrokerBody = RegisterBrokerBody.decode(request.getBody(), requestHeader.isCompressed());            } catch (Exception e) {                throw new RemotingCommandException("Failed to decode RegisterBrokerBody", e);            }        } else {            registerBrokerBody.getTopicConfigSerializeWrapper().getDataVersion().setCounter(new AtomicLong(0));            registerBrokerBody.getTopicConfigSerializeWrapper().getDataVersion().setTimestamp(0);        }
//        =》        RegisterBrokerResult result = this.namesrvController.getRouteInfoManager().registerBroker(            requestHeader.getClusterName(),            requestHeader.getBrokerAddr(),            requestHeader.getBrokerName(),            requestHeader.getBrokerId(),            requestHeader.getHaServerAddr(),            registerBrokerBody.getTopicConfigSerializeWrapper(),            registerBrokerBody.getFilterServerList(),            ctx.channel());
        responseHeader.setHaServerAddr(result.getHaServerAddr());        responseHeader.setMasterAddr(result.getMasterAddr());
//        获取ORDER_TOPIC_CONFIG命名空间的配置        byte[] jsonValue = this.namesrvController.getKvConfigManager().getKVListByNamespace(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG);        response.setBody(jsonValue);
        response.setCode(ResponseCode.SUCCESS);        response.setRemark(null);        return response;    }

进入这个方法,org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#registerBroker

public RegisterBrokerResult registerBroker(        final String clusterName,        final String brokerAddr,        final String brokerName,        final long brokerId,        final String haServerAddr,        final TopicConfigSerializeWrapper topicConfigWrapper,        final List<String> filterServerList,        final Channel channel) {        RegisterBrokerResult result = new RegisterBrokerResult();        try {            try {//                同步注册                this.lock.writeLock().lockInterruptibly();
//                获取broker的集群地址                Set<String> brokerNames = this.clusterAddrTable.get(clusterName);                if (null == brokerNames) {                    brokerNames = new HashSet<String>();                    this.clusterAddrTable.put(clusterName, brokerNames);                }                brokerNames.add(brokerName);
                boolean registerFirst = false;
//               获取指定brokerName的broker数据                BrokerData brokerData = this.brokerAddrTable.get(brokerName);                if (null == brokerData) {                    registerFirst = true;                    brokerData = new BrokerData(clusterName, brokerName, new HashMap<Long, String>());                    this.brokerAddrTable.put(brokerName, brokerData);                }                String oldAddr = brokerData.getBrokerAddrs().put(brokerId, brokerAddr);                registerFirst = registerFirst || (null == oldAddr);
//                如果broker是master                if (null != topicConfigWrapper                    && MixAll.MASTER_ID == brokerId) {                    if (this.isBrokerTopicConfigChanged(brokerAddr, topicConfigWrapper.getDataVersion())                        || registerFirst) {//                        获取topic配置                        ConcurrentMap<String, TopicConfig> tcTable =                            topicConfigWrapper.getTopicConfigTable();                        if (tcTable != null) {                            for (Map.Entry<String, TopicConfig> entry : tcTable.entrySet()) {//                                创建或更新消息队列数据=》                                this.createAndUpdateQueueData(brokerName, entry.getValue());                            }                        }                    }                }
//                存活的broker列表                BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr,                    new BrokerLiveInfo(                        System.currentTimeMillis(),                        topicConfigWrapper.getDataVersion(),                        channel,                        haServerAddr));                if (null == prevBrokerLiveInfo) {                    log.info("new broker registered, {} HAServer: {}", brokerAddr, haServerAddr);                }
//                过滤的broker列表                if (filterServerList != null) {                    if (filterServerList.isEmpty()) {                        this.filterServerTable.remove(brokerAddr);                    } else {                        this.filterServerTable.put(brokerAddr, filterServerList);                    }                }
//                如果broker不是master                if (MixAll.MASTER_ID != brokerId) {//                    获取broker master地址                    String masterAddr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID);                    if (masterAddr != null) {                        BrokerLiveInfo brokerLiveInfo = this.brokerLiveTable.get(masterAddr);                        if (brokerLiveInfo != null) {                            result.setHaServerAddr(brokerLiveInfo.getHaServerAddr());                            result.setMasterAddr(masterAddr);                        }                    }                }            } finally {                this.lock.writeLock().unlock();            }        } catch (Exception e) {            log.error("registerBroker Exception", e);        }
        return result;    }

进入这个方法,创建或更新消息队列数据,org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#createAndUpdateQueueData

  private void createAndUpdateQueueData(final String brokerName, final TopicConfig topicConfig) {        QueueData queueData = new QueueData();        queueData.setBrokerName(brokerName);        queueData.setWriteQueueNums(topicConfig.getWriteQueueNums());        queueData.setReadQueueNums(topicConfig.getReadQueueNums());        queueData.setPerm(topicConfig.getPerm());        queueData.setTopicSynFlag(topicConfig.getTopicSysFlag());
//        查询topic的队列        List<QueueData> queueDataList = this.topicQueueTable.get(topicConfig.getTopicName());        if (null == queueDataList) {            queueDataList = new LinkedList<QueueData>();            queueDataList.add(queueData);            this.topicQueueTable.put(topicConfig.getTopicName(), queueDataList);            log.info("new topic registered, {} {}", topicConfig.getTopicName(), queueData);        } else {            boolean addNewOne = true;
            Iterator<QueueData> it = queueDataList.iterator();            while (it.hasNext()) {                QueueData qd = it.next();                if (qd.getBrokerName().equals(brokerName)) {                    if (qd.equals(queueData)) {//                        topic存在的队列和要保存的队列一样,不需要添加                        addNewOne = false;                    } else {                        log.info("topic changed, {} OLD: {} NEW: {}", topicConfig.getTopicName(), qd,                            queueData);//                        如果topic存在的队列和要保存的队列不一致,就删除存在的队列                        it.remove();                    }                }            }
//            需要添加            if (addNewOne) {                queueDataList.add(queueData);            }        }    }

进入这个方法,org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#registerBroker

public RemotingCommand registerBroker(ChannelHandlerContext ctx,        RemotingCommand request) throws RemotingCommandException {        final RemotingCommand response = RemotingCommand.createResponseCommand(RegisterBrokerResponseHeader.class);        final RegisterBrokerResponseHeader responseHeader = (RegisterBrokerResponseHeader) response.readCustomHeader();        final RegisterBrokerRequestHeader requestHeader =            (RegisterBrokerRequestHeader) request.decodeCommandCustomHeader(RegisterBrokerRequestHeader.class);
        if (!checksum(ctx, request, requestHeader)) {            response.setCode(ResponseCode.SYSTEM_ERROR);            response.setRemark("crc32 not match");            return response;        }
        TopicConfigSerializeWrapper topicConfigWrapper;        if (request.getBody() != null) {            topicConfigWrapper = TopicConfigSerializeWrapper.decode(request.getBody(), TopicConfigSerializeWrapper.class);        } else {            topicConfigWrapper = new TopicConfigSerializeWrapper();            topicConfigWrapper.getDataVersion().setCounter(new AtomicLong(0));            topicConfigWrapper.getDataVersion().setTimestamp(0);        }
//        =》        RegisterBrokerResult result = this.namesrvController.getRouteInfoManager().registerBroker(            requestHeader.getClusterName(),            requestHeader.getBrokerAddr(),            requestHeader.getBrokerName(),            requestHeader.getBrokerId(),            requestHeader.getHaServerAddr(),            topicConfigWrapper,            null,            ctx.channel()        );
        responseHeader.setHaServerAddr(result.getHaServerAddr());        responseHeader.setMasterAddr(result.getMasterAddr());
//        获取ORDER_TOPIC_CONFIG命名空间的配置        byte[] jsonValue = this.namesrvController.getKvConfigManager().getKVListByNamespace(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG);        response.setBody(jsonValue);        response.setCode(ResponseCode.SUCCESS);        response.setRemark(null);        return response;    }

进入这个方法,org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#registerBroker前面介绍过了。

往上返回到这个方法org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#registerBroker结束。

 

说在最后

本次解析仅代表个人观点,仅供参考。

 

加入技术微信群

钉钉技术群

转载于:https://my.oschina.net/u/3775437/blog/3095523

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值