参考文章
RocketMq系列之Producer启动源码分析(一)
https://shared-code.com/article/130
RocketMq系列之Producer启动(一)
视频
https://www.bilibili.com/video/BV1RE411r75d?p=25&spm_id_from=pageDriver
调试
安装跳过测试
mvn clean install -Dmaven.test.skip=true
启动nameserver
启动broker
brocker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr=127.0.0.1:9876
#存储路径
storePathRootDir=D:\\rocketMqTestData\\store
#commitLog 存储路径
storePathCommitLog=D:\\rocketMqTestData\\store\\commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=D:\\rocketMqTestData\\store\\consumequeue
#消息索引存储路径
storePathIndex=D:\\rocketMqTestData\\store\\index
#checkpoint 文件存储路径
storeCheckpoint=D:\\rocketMqTestData\\store\\checkpoint
#abort 文件存储路径
abortFile=D:\\rocketMqTestData\\store\\abort
addr=“127.0.0.1:9876”;
final Channel channel = this.getAndCreateChannel(addr);
if (channel != null && channel.isActive()) {
nameserver的地址: 172.30.36.123:9876
broker的地址: 172.30.36.123:10911
源码调试选择4.5.1,不要选择4.8.0等最新版本,这些版本的调试总会报些奇怪的错误
if (null == nsList || nsList.isEmpty()) {
nsList.add(“127.0.0.1:9876”);
}
if (null == nsList || nsList.isEmpty()) {
throw new MQClientException(
“No name server address, please set it.” + FAQUrl.suggestTodo(FAQUrl.NAME_SERVER_ADDR_NOT_EXIST_URL), null).setResponseCode(ClientErrorCode.NO_NAME_SERVER_EXCEPTION);
}
因为使用的是虚拟机,设置内存也只有1G,所以从 Windows 上开发连接 虚拟机中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。
RemotingTooMuchRequestException: sendDefaultImpl call timeout
关闭window放火墙之后,错误变成
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to 172.30.36.123:9876 failed
消息队列采取的是发布订阅者模式
namesrv想到于注册中心的角色,它有心跳检测机制
nameserver是接受请求并做出响应
我要消费信息,我需要到哪个broker中找,它会询问nameserve
心跳包,初始化
producer主动去拉,而不是nameserve主动推