一、下载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