RocketMQ源碼詳解系列2 《cli CommandLine命令行參數解析》

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章