createNamesrvController方法
//设置rocketmq版本
System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION));
//PackageConflictDetect.detectFastjson();
/*jar包启动时,忽略*/
//构建命令行操作的指令 =》
Options options = ServerUtil.buildCommandlineOptions(new Options());
//mqnamesrv 启动namesrv命令 =》
commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser());
if (null == commandLine) {
System.exit(-1);
return null;
}
//解析配置文件 =》
final NamesrvConfig namesrvConfig = new NamesrvConfig();
namesrvConfig.setRocketmqHome(System.getProperty("user.dir"));
final NettyServerConfig nettyServerConfig = new NettyServerConfig();
//设置 namesrv的服务端口
nettyServerConfig.setListenPort(9876);
/*jar包启动时,忽略*/
//c 指定启动的时候加载配置文件
/**
* -cp .:/Users/squid/self_space/rocketmq/distribution/target/apache-rocketmq/bin/../conf:/Library/Java/JavaVirtualMachines
* /jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:.
*/
if (commandLine.hasOption('c')) {
//命令行启动指定配置文件,前面用c开头
//distribution/conf下的配置文件
String file = commandLine.getOptionValue('c');
if (file != null) {
InputStream in = new BufferedInputStream(new FileInputStream(file));
properties = new Properties();
properties.load(in);
MixAll.properties2Object(properties, namesrvConfig);
MixAll.properties2Object(properties, nettyServerConfig);
//设置命令行启动namesrv指定的配置文件路径
namesrvConfig.setConfigStorePath(file);
System.out.printf("load config properties file OK, %s%n", file);
in.close();
}
}
/*jar包启动时,忽略*/
//打印namesrv的配置信息,命令行上面加p
if (commandLine.hasOption('p')) {
InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_CONSOLE_NAME);
MixAll.printObjectProperties(console, namesrvConfig);
MixAll.printObjectProperties(console, nettyServerConfig);
System.exit(0);
}
//把命令行配置解析到namesrvConfig
MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), namesrvConfig);
//是否获取到RocketmqHome
if (null == namesrvConfig.getRocketmqHome()) {
System.out.printf("Please set the %s variable in your environment to match the location of the RocketMQ installation%n", MixAll.ROCKETMQ_HOME_ENV);
System.exit(-2);
}
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
System.out.println(namesrvConfig.getRocketmqHome() + "/target/classes/logback_namesrv.xml");
//logback日志配置
configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/target/classes/logback_namesrv.xml");
log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
MixAll.printObjectProperties(log, namesrvConfig);
MixAll.printObjectProperties(log, nettyServerConfig);
//创建namesrv控制器 =》
final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);
// remember all configs to prevent discard把配置文件配置值的属性值注册到namesrv控制器
controller.getConfiguration().registerConfig(properties);
return controller;
ServerUtil.buildCommandlineOptions(new Options())
public static Options buildCommandlineOptions(final Options options) {
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);
// 这里可以看到启动的时候有一个n参数指定namesrv的地址,可以是单机可以是集群,启动地址之间用;分开
opt =
new Option("n", "namesrvAddr", true,
"Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876");
opt.setRequired(false);
options.addOption(opt);
return options;
}