文章目录
从启动脚本到启动类
我们知道RocketMQ的Broker端的启动方式为,进入到RocketMQ的bin目录下,运行对应的mqbroker脚本。
RocketMQ的Linux和Windows脚本内容也就是对应的mqbroker脚本,这里贴出来看看
//省略部分脚本
export ROCKETMQ_HOME
sh ${ROCKETMQ_HOME}/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup $@
上面这段是Linux系统下的shell脚本,
if not exist "%ROCKETMQ_HOME%\bin\runbroker.cmd" echo Please set the ROCKETMQ_HOME variable in your environment! & EXIT /B 1
call "%ROCKETMQ_HOME%\bin\runbroker.cmd" org.apache.rocketmq.broker.BrokerStartup %*
IF %ERRORLEVEL% EQU 0 (
ECHO "Broker starts OK"
)
上面这段是Windows系统下的cmd脚本命令。从这两段脚本中可以看出,最后的都会运行一个runbroker的脚本,还会把一个类的全路径名作为参数传进去,这个类就是启动类BrokerStartup
。
启动类BrokerStartup
BrokerStartup
的启动函数是main函数,里面的代码也简单只有一行,主要的逻辑也简单,就是创建BrokerController
类(后面说),然后启动。
public static void main(String[] args) {
//创建createBrokerController然后启动
start(createBrokerController(args));
}
启动的准备工作createBrokerController
public static BrokerController createBrokerController(String[] args) {
//MQ的版本号
System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION));
//设置broker的netty客户端的发送缓冲大小,默认是128 kb
if (null == System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE)) {
NettySystemConfig.socketSndbufSize = 131072;
}
//设置broker的netty客户端的接收缓冲大小,默认是128 kb
if (null == System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE)) {
NettySystemConfig.socketRcvbufSize = 131072;
}
try {
//PackageConflictDetect.detectFastjson();
//命令行选项解析
Options options = ServerUtil.buildCommandlineOptions(new Options());
//解析命令栏中的 mqbroker
commandLine = ServerUtil.parseCmdLine("mqbroker", args, buildCommandlineOptions(options),
new PosixParser());
if (null == commandLine) {
System.exit(-1);
}
//相关配置的存储对象
final BrokerConfig brokerConfig = new BrokerConfig();
final NettyServerConfig nettyServerConfig = new NettyServerConfig();
final NettyClientConfig nettyClientConfig = new NettyClientConfig();
//是否使用TLS (TLS是SSL的升级版本,TLS是SSL的标准化后的产物,有1.0 1.1 1.2三个版本)
nettyClientConfig.setUseTLS(Boolean.parseBoolean(System.getProperty(TLS_ENABLE,
String.valueOf(TlsSystemConfig.tlsMode == TlsMode.ENFORCING))));
//设置netty的服务端监听的端口 10911
nettyServerConfig.setListenPort(10911);
//消息存储相关的配置
final MessageStoreConfig messageStoreConfig = new MessageStoreConfig();
//如果Broker是Slave角色,消息占用内存大小的比率 比默认的40% 还要小 10%
if (BrokerRole.SLAVE == messageStoreConfig.getBrokerRole()) {
int ratio = messageStoreConfig.getAccessMessageInMemoryMaxRatio() - 10;
//设置消息的内存最大占比,如果内存占比超过设定值,那么就进行置换
messageStoreConfig.setAccessMessageInMemoryMaxRatio(ratio);
}
......省略配置读取保存相关代码
//创建BrokerController
final BrokerController controller = new BrokerController(
brokerConfig,
nettyServerConfig,
nettyClientConfig,
messageStoreConfig);
// remember all configs to prevent discard
//缓存额外配置
controller.getConfiguration().registerConfig(properties);
//初始化BrokerController
boolean initResult = controller.initialize();
if (!initResult) {
controller.shutdown();
System.exit(-3);
}
//注册关闭的钩子方法
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
private volatile boolean hasShutdown = false;
private