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

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