org.apache.rocketmq.namesrv.kvconfig.KVConfigSerializeWrapper
kvConfig序列化包装器,内部只有一个配置表:
private HashMap<String/* Namespace */, HashMap<String/* Key */, String/* Value */>> configTable;
public HashMap<String, HashMap<String, String>> getConfigTable() {
return configTable;
}
public void setConfigTable(HashMap<String, HashMap<String, String>> configTable) {
this.configTable = configTable;
}
可以看到这个KVConfig其实是基于Namesapce的,还记得RocketMq理论学习里的Namesapce,第一次在源码里看到理论中的东西。总之,配置项的分类是基于namespace的。
回到NamesrvController,再往下就是创建一个执行器(线程池),注册处理器,还记得之前说RocketMq底层有个特点,就是执行方法,都要传一个执行器(executor 底层是线程池),一个处理器(processor 就是具体的任务),接下来看下这个注册处理器
registerProcessor();
底层干了什么
private void registerProcessor() {
if (namesrvConfig.isClusterTest()) {
this.remotingServer.registerDefaultProcessor(new ClusterTestRequestProcessor(this, namesrvConfig.getProductEnvName()),
this.remotingExecutor);
} else {
this.remotingServer.registerDefaultProcessor(new DefaultRequestProcessor(this), this.remotingExecutor);
}
}
首先判断是否是集群测试(clusterTest),这个开关是写死为false的,所以我们直接看else的内容
@Override
public void registerDefaultProcessor(NettyRequestProcessor processor, ExecutorService executor) {
this.defaultRequestProcessor = new Pair<NettyRequestProcessor, ExecutorService>(processor, executor);
}
可以看到就是初始化了remotingServer中的DefaultProcessor这个这个处理器
protected Pair<NettyRequestProcessor, ExecutorService> defaultRequestProcessor;
处理器底层就是这个Pair,之前我们阅读NettyRemotingServer已经看过了。
注册处理器之后,是一系列的定时任务,看下都干了什么:
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
NamesrvController.this.routeInfoManager.scanNotActiveBroker();
}
}, 5, 10, TimeUnit.SECONDS);
第一个延时任务,延时执行5s
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);