「这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战」
源码下载
在读RocketMQ源码的时候,我们首先需要将源码从开源网站下将源码下载到本地,然后启动起来,这样可以方便我们在读源码的时候,有些地方读不懂,可以采取本地Debug的方式来跟踪执行的结果,方便我们更好的理解作者的设计思想。源码下载地址:
将源码下载到本地后,导入到Idea中,配置maven地址,导入完依赖即可
启动MQ
启动Namesrv模块
在工程中找到启动类:NamesrvStartup,启动里面的main方法,直接启动汇报:
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
需要配置ROCKETMQ_HOME 环境变量,在启动NamesrvStartup的时候加上环境变量
ROCKETMQ_HOME=E:\workspace\源码\rocketmq\rocketmqHome
这个时候启动还是会报错 可以看出,这是在启动的时候会去配置的目录中,找conf目录下的logback_namesrv.xml 日志配置文件,在配置的目录下创建conf目录,然后将源码distribution目录下的conf目录中的:logback_namesrv.xml 拷贝过去,再次启动即可
The Name Server boot success. serializeType=JSON
启动Broker模块
在工程类中找到rocketmq-broker模块下的BrokerStartup类中的main方法,然后启动,在启动的时候也会出现:
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
也需要在启动环境中配置:ROCKETMQ_HOME,在配置完成后,再次启动会报下面的错误:
这个时候需要将distribution目录下conf中的logback_broker.xml文件拷贝到配置的目录下的conf后,再次启动就会启动成功
The broker[silly, 192.168.0.103:10911] boot success. serializeType=JSON
在distribution目录下还有个broker.conf文件,这个文件用来设置broler启动的参数信息,在启动的时候需要指定文件文件的所在地方
-c E:\workspace\源码\rocketmq\rocketmqHome\conf\broker.conf
这个时候启动会出现下面的提示:
The broker[broker-a, 192.168.0.103:10911] boot success. serializeType=JSON
可以看出,这次启动的broler的名字是broker-a,是因为broker.conf 中的brokerName配置的,说明此次启动读到了我们指定的配置文件
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
验证启动结果
发送消息
使用源码中提供的生产者和消费者代码来验证是否启动成功,找到rocketmq-example中的生产者代码:
org.apache.rocketmq.example.quickstart.Producer
修改源码, 这是NameServer地址后启动
producer.setNamesrvAddr("127.0.0.1:9876");
这个时候启动会报错
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: TopicTest
表示在发送的是否没有TopicTest,需要需要我们在broker.conf文件中加一行配置,topic在使用的时候允许客户端自动创建,重新启动broker
autoCreateTopicEnable = true
但是小编这里再次发送MQ的时候也会出现上面的问题,后来我在broker.conf文件中,配置了NameServer地址
namesrvAddr = 127.0.0.1:9876
在重新启动broker,就会打印下面那样的启动信息
The broker[broker-a, 192.168.0.103:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
再次发送消息,就会发送成功
消费消息
找到org.apache.rocketmq.example.quickstart.Consumer 这个类中的代码,指定NameServer的地址后启动
consumer.setNamesrvAddr("127.0.0.1:9876");
可查看到控制台打印的消费者日志
通过上面的步骤,一个基本的RocetMQ单机版本,通过源码启动成功。
小配置
日志文件目录设置
在启动的时候,日志配置文件是将日志打印到${user.name},自己认为不好找日志,就把日志打印到ROCKETMQ_HOME下的logs配置文件中,需要将日志文件中的user.name替换为:ROCKETMQ_HOME,然后重启,就会将日志记录到自定义的logs下