RocketMQ 源码解读一 准备工作

本文介绍了下载RocketMQ源码并运行的过程,包括从github下载源码、配置环境变量、修改路径等。还分析了生产者发送数据报No route info of this topic错误的原因,即broker未向namesrv注册,可通过配置环境变量解决。最后展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、下载RocketMQ源码并运行成功

1、从github上下载源码并导入工程包

2、配置环境变量

RocketMQ启动需要读取配置文件,并在store文件夹下创建文件存储数据,但这些路径都是在代码里写死的,并默认在用户目录下,所以我们首先要更改这个路径。

1)配置环境变量,路径随便写

2)将rocketmq-distribution工程的conf文件夹下的broker.cnf和logback_namesrv.xml文件拷到rocketmq-namesrv的conf文件夹下(按理说namesrv读取配置文件的路径也是从环境变量中取的,但不知道为什么没有效)

修改logback_namesrv.xml中的日志地址,我这里改到了D:/rocketmq/logs文件夹下

3)全局搜索user.home,并将路径更改成自己想要的路径,我这里改到了D:/rocketmq文件夹下

将配置信息的xml文件放到你修改后的目录下

最终效果,我把配置文件、日志、数据文件都放在一个根目录下了

二、生产者发送数据报No route info of this topic错误

1、源码定位

namesrv工程中的RouteInfoManager类的第374行代码,会根据生产者发送过来的topic名称,从topicQueueTable中获取QueueData集合。就是因为queueDataList是null,才会返回这个错误

    public TopicRouteData pickupTopicRouteData(final String topic) {
        TopicRouteData topicRouteData = new TopicRouteData();
        boolean foundQueueData = false;
        boolean foundBrokerData = false;
        Set<String> brokerNameSet = new HashSet<String>();
        List<BrokerData> brokerDataList = new LinkedList<BrokerData>();
        topicRouteData.setBrokerDatas(brokerDataList);

        HashMap<String, List<String>> filterServerMap = new HashMap<String, List<String>>();
        topicRouteData.setFilterServerTable(filterServerMap);

        try {
            try {
                this.lock.readLock().lockInterruptibly();
                List<QueueData> queueDataList = this.topicQueueTable.get(topic);
                if (queueDataList != null) {
                    topicRouteData.setQueueDatas(queueDataList);
                    foundQueueData = true;

                    Iterator<QueueData> it = queueDataList.iterator();
                    while (it.hasNext()) {
                        QueueData qd = it.next();
                        brokerNameSet.add(qd.getBrokerName());
                    }

                    for (String brokerName : brokerNameSet) {
                        BrokerData brokerData = this.brokerAddrTable.get(brokerName);
                        if (null != brokerData) {
                            BrokerData brokerDataClone = new BrokerData(brokerData.getCluster(), brokerData.getBrokerName(), (HashMap<Long, String>) brokerData
                                .getBrokerAddrs().clone());
                            brokerDataList.add(brokerDataClone);
                            foundBrokerData = true;
                            for (final String brokerAddr : brokerDataClone.getBrokerAddrs().values()) {
                                List<String> filterServerList = this.filterServerTable.get(brokerAddr);
                                filterServerMap.put(brokerAddr, filterServerList);
                            }
                        }
                    }
                }
            } finally {
                this.lock.readLock().unlock();
            }
        } catch (Exception e) {
            log.error("pickupTopicRouteData Exception", e);
        }

        log.debug("pickupTopicRouteData {} {}", topic, topicRouteData);

        if (foundBrokerData && foundQueueData) {
            return topicRouteData;
        }

        return null;
    }

2、broker未向namesrv注册

产生上述问题的原因,是broker没有获取到namesrv的地址,无法向namesrv注册。可以配置环境变量NAMESRV_ADDR,这里我图方便直接写死了

三、运行结果

生产者、消费者跑完后,store文件夹下结果如图。commitlog文件夹下有2个1G的文件,consumequeue文件夹下有对应Topic名的文件夹,里面4个queue文件夹,每个文件5.72MB

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值