我看的源碼是RocketMQ的3.2.6版本,該版本是RocketMQ被apache組織孵化之前的版本了,但是不影響源碼閱讀,閱讀源碼主要是想學一下大牛們的開發思想
namesrv的項目結構:
NamesrvStartup類作爲namesrv的啓動入口,主要作用是加載配置文件,環境檢查,調用NamesrvController類啓動server服務
NamesrvController作爲namesrv服務控制類,作爲namesrv服務的控制核心,其主要方法如下:
public boolean initialize() {
// 加載KV配置
this.kvConfigManager.load();
// 初始化通信層
this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);
// 初始化線程池
this.remotingExecutor =
Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(),
new ThreadFactoryImpl("RemotingExecutorThread_"));
this.registerProcessor();
// 增加定時任務--掃描過期的broker
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
NamesrvController.this.routeInfoManager.scanNotActiveBroker();
}
}, 5, 10, TimeUnit.SECONDS);
//打印所有的config
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
NamesrvController.this.kvConfigManager.printAllPeriodically();
}
}, 1, 10, TimeUnit.MINUTES);
// this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
//
// @Override
// public void run() {
// NamesrvController.this.routeInfoManager.printAllPeriodically();
// }
// }, 1, 5, TimeUnit.MINUTES);
return true;
}
/**
* 啓動namesrv服務端
* @throws Exception
* @author: yangcheng
*/
public void start() throws Exception {
this.remotingServer.start();
}
RouteInfoManager.java類,原註釋是“運行過程中的路由信息,數據只在內存中因此宕機後數據消失;但是Broker會定期推送最新數據”,其主要屬性如下(類中其他方法主要作用就是對這些屬性的增刪查改):
/**
* topic與該topic相關連的所有queue--queue中包含了brokerName值
*/
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
/**
* broker的信息緩存
*/
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
/**
* 集羣名稱與集羣中所有brokername的關係緩存
*/
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
/**
* 激活狀態的Broker
*/
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;