1.我們分析rocketmq源碼時,會遇到命令rocketmq啓動時,會有設置命令行參數,如-c 配置文件地址 -h打印幫助等待參數,今天我們就來講下怎麼實現的。
看下圖
上面代碼片段是namesrv的源碼,就是這個apache的cli CommandLine類 完成了命令行參數解析。
這裏我拿namesrv的源碼所有命令行來作了一個測試類
public class MyTest {
public static void main(String[] args) throws ParseException {
String[] arg = { "-h", "-c", "D:\\dev\\java_workspace\\rocketmq\\conf\\namesrv.conf" };
testOptions(arg);
}
public static void testOptions(String[] args) throws ParseException {
// 創建選項集
Options options = new Options();
// 添加選項 -h --help h:短選項名稱 help:長選項名 false:後面不需要接參數 Print help:描述信息
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);
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);
opt = new Option("c", "configFile", true, "Name server config properties file");
opt.setRequired(false);
options.addOption(opt);
opt = new Option("p", "printConfigItem", false, "Print all config item");
opt.setRequired(false);
options.addOption(opt);
CommandLine commandLine = new PosixParser().parse(options, args);
if (commandLine.hasOption('h')) {
// 如果客戶端的命令行中包含-h 就打印幫助信息
new HelpFormatter().printHelp("RocketMQ-NameSrv", options, true);
}
System.out.println("-------------------------------------");
// 遍歷 打印 客戶端啓動時設置的命令行參數和值
Option[] opts = commandLine.getOptions();
if (opts != null) {
for (Option opt1 : opts) {
String name = opt1.getLongOpt();
String value = commandLine.getOptionValue(name);
System.out.println(name + "=>" + value);
}
}
}
}
運行如下:
所以通過apache 的cli CommandLine就很容易的處理命令行參數問題。
2.下面我們來分析rocketmq 中 namesrv是怎麼處理,命令行參數的。
我們跟蹤到 buildCommandlineOptions 方法,看加了多少個Option
返回上層執行buildCommandlineOptions
最後執行 ServerUtil.parseCmdLine 方法得到commandLine對象。
繼續往下走,看namesrv是如何處理命令行參數的
如果加了-p,回打印出如下格式的環境變量
以上我們就得出了,namesrv的所有命令行
-h : 打印幫助
-n 127.0.0.1:9876 : brocker用,指定namesrv地址
-c d://xx/brocker.conf : 指定啓動時配置屬性文件地址。
-p : 打印程序所有環境變量信息
namesrc啓動正是需要這兩個關鍵的配置類
NamesrvConfig
NettyServerConfig
後面會講namesrv的啓動流程。
老生常談:深圳有愛好音樂的會打鼓(吉他,鍵盤,貝斯等)的程序員和其它職業可以一起交流加入我們樂隊一起嗨。我的QQ:657455400 表演視頻實例https://v.qq.com/x/page/f0517awx0x4.html