bboyjing's blog

RocketMQ源码分析之【rocketmq-srvutil】

从这一章开始,着手来试着分析RocketMQ的源码。本人fork了源码,准备将读过的代码都加上注释,附上项目地址。首先看下源码结构,RocketMQ共包含9个核心模块:

  • rocketmq-broker
  • rocketmq-client
  • rocketmq-common
  • rocketmq-filtersrv
  • rocketmq-namesrv
  • rocketmq-remoting
  • rocketmq-srvutil
  • rocketmq-store
  • rocketmq-tools

先不管每个模块的作用,后面都会涉及到。本来想从rocketmq-namesrv项目开始,瞄了一眼启动代码,其中用到了rocketmq-srvutil项目,这个项目只有一个类,而且挺简单的,比较容易开头。

项目作用

该项目的作用是提供了处理命令行参数的功能,而且只有一个类ServerUtil。其中用了org.apache.commons.cli工具,关于cli有同学可能没怎么接触过,那么先来了解下。

CLI

CLI即Command Line Interface,也就是命令行接口,它为Java程序访问和解析命令行参数提供了一种统一的接口,不需要再遍历main函数中的String[] args参数了。随便建个项目跑跑几个测试就会用了,RocketMQ引用的版本是1.2,我们就拿这个版本来试试,直接看代码:

1
2
3
4
5
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class CliTest {
public static void main(String[] args) throws ParseException {
Options options = new Options();
// -t 第二个参数false表示不支持参数值
options.addOption("t", false, "display current time");
// -c 第二个参数true表示支持参数值
options.addOption("c", true, "country code");
/**
* Posix类型的Parser
* Posix命令行的格式为: -参数名 参数值
*/
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
if (cmd.hasOption("c")) {
String countryCode = cmd.getOptionValue("c");
System.out.println(countryCode);
}
if (cmd.hasOption("t")) {
String countryCode = cmd.getOptionValue("t");
System.out.println(countryCode);
}
// 打印帮助信息
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CliTest", options, true);
}
}

运行时添加参数-c china -t nothing,运行结果如下:

1
2
3
4
5
china
null
usage: CliTest [-c <arg>] [-t]
-c <arg> country code
-t display current time

对照注释和输出,也没啥好解释的了。

ServerUtil类

该类中也没几个方法,我们就一个个来看下。

buildCommandlineOptions方法

该方法的作用就是添加帮助信息和Name Server地址信息参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static Options buildCommandlineOptions(final Options options) {
// 添加-h/-help参数,非必须
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);
// 添加-n/namesrvAddr参数,非必须
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;
}

parseCmdLine方法

该方法的作用是通过参数和Parser类型来构造CommandLine,并且如果参数有-h,则打印帮助信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static CommandLine parseCmdLine(final String appName, String[] args, Options options,
CommandLineParser parser) {
HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
CommandLine commandLine = null;
try {
// 通过传递的Parser构造CommandLine
commandLine = parser.parse(options, args);
// 如果有-h参数,打印帮助信息
if (commandLine.hasOption('h')) {
hf.printHelp(appName, options, true);
return null;
}
} catch (ParseException e) {
hf.printHelp(appName, options, true);
}
return commandLine;
}

printCommandLineHelp方法

该方法的作用仅仅是打印命令行帮助信息,代码简单就不贴出来了。

commandLine2Properties方法

该方法的作用是把参数转成java.util.Properties类,代码简单就不贴出来了。

rocketmq-srvutil子项目的源码就到这些了。