阅读 101

RocketMQ源码学习(一)-NameServer启动

关于NameServer前面已经介绍了很多。本章不做过多的叙述。直接围绕源码开展学习。

启动类-NamesrvStartup

位置:org.apache.rocketmq.namesrv.NamesrvStartup

关键部分代码:

// 创建核心处理器NamesrvController,类似web,用于接收各种挽网络请求 NamesrvController controller = createNamesrvController(args); // 启动NameServer start(controller); 复制代码

createNamesrvController配置NameServer核心参数

位置:org.apache.rocketmq.namesrv.NamesrvStartup#createNamesrvController

开始部分是对运行时参数的检测,部分代码如下:

// ToDo: k2: 运行时参数命令的检测 Options options = ServerUtil.buildCommandlineOptions(new Options()); commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser()); if (null == commandLine) {     System.exit(-1);     return null; } 复制代码

接着是核心参数的填充:

NamesrvConfig:包含NameServer自身运行的参数;

NettyServerConfig:包含Netty服务端的参数配置。

部分代码如下:

// ToDo: k1: NameServer的三个核心配置 // NamesrvConfig:包含NameServer自身运行的参数; // NettyServerConfig:包含Netty服务端的参数配置。 final NamesrvConfig namesrvConfig = new NamesrvConfig(); final NettyServerConfig nettyServerConfig = new NettyServerConfig(); nettyServerConfig.setListenPort(9876); // ToDo: k2->解析三个配置对象 if (commandLine.hasOption('c')) {     ..... } if (commandLine.hasOption('p')) {     ..... } 复制代码

Start启动

start方法中主要是controller的初始化,还有一个比较有意思的关闭MQ服务的钩子。

部分代码如下:

public static NamesrvController start(final NamesrvController controller) throws Exception { ...     // controller初始化,主要初始化时几个定时器     boolean initResult = controller.initialize(); ...     // 关闭MQ服务的钩子     Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() {         @Override         public Void call() throws Exception {             controller.shutdown();             return null;         }     }));     controller.start();     return controller; } 复制代码

initialize初始化

org.apache.rocketmq.namesrv.NamesrvController#initialize

部分代码如下:

// NameController初始化 public boolean initialize() {     // 加载KV配置     this.kvConfigManager.load();     // 创建NettyServer网络处理对象     this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);     // Netty服务工作线程池     this.remotingExecutor =         Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_"));     // 注册Proccessor,把remotingExecutor注入到remotingServer中     this.registerProcessor();     //启动定时任务一:NameServer 每隔1Os 扫描一次Broker , 移除处于不激活状态的Broker     this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {         @Override         public void run() {             NamesrvController.this.routeInfoManager.scanNotActiveBroker();         }     }, 5, 10, TimeUnit.SECONDS);     // 启动定时任务二:names 巳rver 每隔10 分钟打印一次KV 配置     this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {         @Override         public void run() {             NamesrvController.this.kvConfigManager.printAllPeriodically();         }     }, 1, 10, TimeUnit.MINUTES);          ... } 复制代码

至此,NameServer就启动完成了。其整体结构如下:

image.png


作者:YuJian
链接:https://juejin.cn/post/7021042078893211661


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐