开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):NameServer 启动步骤三】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12463
NameServer 启动步骤三
步骤三:
在JVM进程关闭之前,先将线程池关闭,及时释放资源
boolean initResult = controller.initilize();
if ( !initResult) {
controller.shutdown( );system.exit( status: -3);
}
在controller初始化完成之后,启动之前需要进行以下操作:
//注册JVM钩子函数代码
JVM退出时,去执行call方法,call方法的作用是资源释放
Runtime.getRuntime().addshutdowHook(new ShutdownHook
Thread(Log,new callable<Void>() {
@override
public void call() throws Exception {
//释放资源
controller.shutdown( );
return null;
}));
在下面代码中将线程池关闭,做出资源释放:
public void shutdown() {
this.remotingserver.shutdown();
this.remotingExecutor.shutdown();
this.scheduledExecutorService.shutdown();
if (this.filewatchservice != null) {
this.filewatchservice. shutdown( );
}
}
NameServer启动流程总结:
首先是NameSrvrStartup,它是启动入口,在这里面是用main方法,在main中调用createNameServerController去创建NameServerController。创建NameServerController,首先要创建namesrvconfig,之后再创建nettyserverconfig,然后去填充namesrvconfig和nettyserverconfig配置类,通过这两个配置类创建NameServercontroller对象。之后启动controller,在启动controller时会进行一些初始化。在NameServerStartup中先完成初始化,在真正的启动controller,在启动之前还要在JVM里注册钩子函数,钩子函数的作用是在JVM退出时释放controller资源。