在 IDEA中启动RocketMQ的NameServer源码 这篇文章中,我们创建了RocketMQ环境变量,设置好了运行NameServer所需要的目录和文件,最后成功启动。接下来就是对Broker的源码启动流程了。
1.添加启动类和配置
1.1 添加新的启动模块
点击NamesrvStartup,选择Edit Configurations:
弹出框中选择添→Application:
1.2 修改broker模块配置
我们需要修改Main class,如果在Search by Name选项中搜索不到BrokerStartup,则切换到Project选项中,选择broker模块,找到BrokerStartup,点击OK即可:
一般情况下是可以直接搜索到的:
手动选择Use casspath of module选项中的模块为rocketmq-broker:
然后在Program arguments选项中为启动broker时指定配置文件:
-c D:\dev\rocketmq_workspace\conf\broker.conf
其中D:\dev\rocketmq_workspace
是上一节中配置的RocketMQ的运行目录,-c会使得broker运行时查找该命令之后的文件,使用该文件中的各种参数。
最后为broker指定ROCKETMQ_HOME环境变量(这里设置跟NameServer为同一个,如果是在操作系统中添加的就不用再次添加了),这样broker在运行的时候将会使用该运行目录,基于指定的配置文件来启动,然后在logs目录下存储日志等操作。最终的配置如下图所示:
2.添加broker配置文件
在下载的RocketMQ源码 distrbution\bin
目录中,找到logback_broker.xml
文件,复制到 D:\dev\rocketmq_workspace\conf
目录下,打开该文件,然后修改里面的地址,把${user.home}都查找替换为你的rocketmq运行目录。
3.启动broker
在工具栏中找到debug图标,点击启动:
启动成功,将会打印如下日志:
Connected to the target VM, address: '127.0.0.1:63680', transport: 'socket'
The broker[broker-a, 10.8.0.46:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
如果启动broker之前,nameserver还没有启动,broker也不会报错,还是会打印出上面的消息。但在启动日志文件(即D:\dev\rocketmq_workspace\logs\rocketmqlogs
目录下的broker.log)中则会报出问题:
2020-06-01 14:45:54 INFO main - Try to start service thread:TransactionalMessageCheckService started:false lastThread:null
2020-06-01 14:45:55 WARN brokerOutApi_thread_1 - registerBroker Exception, 127.0.0.1:9876
org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to 127.0.0.1:9876 failed
at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:392) ~[classes/:na]
at org.apache.rocketmq.broker.out.BrokerOuterAPI.registerBroker(BrokerOuterAPI.java:201) ~[classes/:na]
at org.apache.rocketmq.broker.out.BrokerOuterAPI.access$000(BrokerOuterAPI.java:61) ~[classes/:na]
at org.apache.rocketmq.broker.out.BrokerOuterAPI$1.run(BrokerOuterAPI.java:154) ~[classes/:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
2020-06-01 14:45:55 INFO main - The broker[broker-a, 10.8.0.46:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
2020-06-01 14:46:03 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2020-06-01 14:46:03 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
后启动nameserver也没问题,broker会定时根据boker.conf中配置的nameserver地址进行通信,直至注册上。最终,正确的日志如下:
2020-06-01 14:44:30 INFO FileWatchService - FileWatchService service started
2020-06-01 14:44:30 INFO main - Try to start service thread:PullRequestHoldService started:false lastThread:null
2020-06-01 14:44:30 INFO PullRequestHoldService - PullRequestHoldService service started
2020-06-01 14:44:30 INFO main - Try to start service thread:TransactionalMessageCheckService started:false lastThread:null
2020-06-01 14:44:30 INFO brokerOutApi_thread_1 - register broker[0]to name server 127.0.0.1:9876 OK
2020-06-01 14:44:30 INFO main - The broker[broker-a, 10.8.0.46:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
2020-06-01 14:44:39 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2020-06-01 14:44:39 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2020-06-01 14:44:40 INFO brokerOutApi_thread_2 - register broker[0]to name server 127.0.0.1:9876 OK
以后如果broker有什么问题,可以直接查看该日志文件。至此,我们搞定了nameserver和broker的源码启动,同时拥有了RocketMQ的官方控制台(可参考RocketMQ可视化界面搭建),
接下来就可以在本地源码的example模块中,使用各种发送和接收消息的练习了。