一、前言
環境:window 64bit , mq版本爲4.5.1 , jdk 1.8
二、namesrv配置相關
1.命令行參數
可以看到namesrv可以通過配置文件配置相應的參數和地址
# mqnamesrv.cmd -h
usage: mqnamesrv [-c <arg>] [-h] [-n <arg>] [-p]
-c,--configFile <arg> 配置文件路徑
-h,--help 打印幫助
-n,--namesrvAddr <arg> Name server 地址, eg: 192.168.0.1:9876; 192.168.0.2:9876
-p,--printConfigItem 打印所有配置項到控制檯
查看namesrv有哪些配置項可以供我們配置
# mqnamesrv.cmd -p
RocketmqNamesrvConsole - kvConfigPath=C:\Users\Administrator\namesrv\kvConfig.json
NameServer 配置文件路徑
RocketmqNamesrvConsole - configStorePath=C:\Users\Administrator\namesrv\namesrv.properties
RocketmqNamesrvConsole - productEnvName=center
是否開啓集羣測試
RocketmqNamesrvConsole - clusterTest=false
是否支持順序消息
RocketmqNamesrvConsole - orderMessageEnable=false
監聽端口
RocketmqNamesrvConsole - listenPort=9876
Netty 業務線程池線程個數
RocketmqNamesrvConsole - serverWorkerThreads=8
RocketmqNamesrvConsole - serverCallbackExecutorThreads=0
RocketmqNamesrvConsole - serverSelectorThreads=3
send oneway 消息請求併發度
RocketmqNamesrvConsole - serverOnewaySemaphoreValue=256
異步消息發送最大併發度
RocketmqNamesrvConsole - serverAsyncSemaphoreValue=64
網絡連接最大空閒時間,單位秒,如果連接空閒時間超過該參數設置的值,連接將被關閉
RocketmqNamesrvConsole - serverChannelMaxIdleTimeSeconds=120
網絡 socket 發送緩存區大小,單位 B,即默認爲 64KB
RocketmqNamesrvConsole - serverSocketSndBufSize=65535
網絡 socket 接收緩存區大小,單位 B,即默認爲 64KB
RocketmqNamesrvConsole - serverSocketRcvBufSize=65535
ByteBuffer 是否開啓緩存,建議開啓
RocketmqNamesrvConsole - serverPooledByteBufAllocatorEnable=true
是否啓用 Epoll IO 模型
RocketmqNamesrvConsole - useEpollNativeSelector=false
2.配置namesrv.properties
創建namesrv.properties文件並輸入以下內容,這裏爲了演示只配置了端口爲9877,其他爲默認值
listenPort = 9877
通過配置文件的方式啓動namesrv
start mqnamesrv.cmd -c f:\\RocketMQ\rocketmq-all-4.5.1\distribution\conf\namesrv.properties
輸出如下內容表示啓動成功:
load config properties file OK, f:\\RocketMQ\rocketmq-all-4.5.1\distribution\conf\namesrv.properties
The Name Server boot success. serializeType=JSON
檢查配置是否生效
查看端口占用情況
# netstat -aon|findstr "9877"
TCP 0.0.0.0:9877 0.0.0.0:0 LISTENING 8632
TCP [::]:9877 [::]:0 LISTENING 8632
根據pid查進程名,可以看到已經是生效了的
# tasklist|findstr "8632"
java.exe 8632 Console 13 98,800 K
3.namesrv如何讀取配置文件
我們來看org.apache.rocketmq.namesrv.NamesrvStartup.java這個類的一段代碼, 大致邏輯就是讀取配置文件內容,通過反射方式將配置文件中的值設置到配置對象對應的變量
// namesrv和nettyServer的配置對象
final NamesrvConfig namesrvConfig = new NamesrvConfig();
final NettyServerConfig nettyServerConfig = new NettyServerConfig();
// 默認監聽端口爲9876
nettyServerConfig.setListenPort(9876);
// 如果命令行參數中有c , 也就是剛纔啓動namesrv時有指定配置文件路徑
if (commandLine.hasOption('c')) {
// 拿到文件路徑
String file = commandLine.getOptionValue('c');
if (file != null) {
InputStream in = new BufferedInputStream(new FileInputStream(file));
properties = new Properties();
// 將配置文件的值存到properties對象裏
properties.load(in);
// 通過反射方式調用namesrvConfig的set方法賦值
MixAll.properties2Object(properties, namesrvConfig);
MixAll.properties2Object(properties, nettyServerConfig);
namesrvConfig.setConfigStorePath(file);
System.out.printf("load config properties file OK, %s%n", file);
in.close();
}
}