/**
* $Id: NamesrvController.java 1831 2013-05-16 01:39:51Z shijia.wxr $
*/
package com.alibaba.rocketmq.namesrv;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.rocketmq.common.MixAll;
import com.alibaba.rocketmq.common.namesrv.NamesrvConfig;
import com.alibaba.rocketmq.namesrv.daemon.NamesrvClient;
import com.alibaba.rocketmq.namesrv.daemon.NamesrvSync;
import com.alibaba.rocketmq.namesrv.daemon.PollingAddress;
import com.alibaba.rocketmq.namesrv.processor.AllRequestProcessor;
import com.alibaba.rocketmq.namesrv.topic.DefaultNamesrvConfigManager;
import com.alibaba.rocketmq.namesrv.topic.DefaultTopicRuntimeDataManager;
import com.alibaba.rocketmq.namesrv.topic.NamesrvConfigManager;
import com.alibaba.rocketmq.namesrv.topic.TopicRuntimeDataManager;
import com.alibaba.rocketmq.remoting.RemotingServer;
import com.alibaba.rocketmq.remoting.netty.NettyClientConfig;
import com.alibaba.rocketmq.remoting.netty.NettyRemotingServer;
import com.alibaba.rocketmq.remoting.netty.NettyServerConfig;
/**
* Name server �������������
*
* @author vintage.wang@gmail.com shijia.wxr@taobao.com
* @author lansheng.zj@taobao.com
*/
public class NamesrvController {
private static final Logger log = LoggerFactory.getLogger(MixAll.NamesrvLoggerName);
// Name Server����
private final NamesrvConfig namesrvConfig;
// ͨ�Ų�����
private final NettyServerConfig nettyServerConfig;
// nameserver�����ͨ�Ų����
private RemotingServer remotingServer;
// nameserver����������������̳߳�
private ExecutorService requestsServerExecutor;
private TopicRuntimeDataManager topicInfoManager;
private NamesrvConfigManager namesrvConfigManager;
// namesrv��������ͬ��
private NamesrvSync namesrvSync;
// namesrv��ȡbroker����
private NamesrvClient namesrvClient;
// ��ѯ��ȡnamesrv��ַ
private PollingAddress pollingAddress;
public NamesrvController(final NamesrvConfig namesrvConfig, final NettyServerConfig nettyServerConfig,
final NettyClientConfig nettyClientConfig) {
this.namesrvConfig = namesrvConfig;
this.nettyServerConfig = nettyServerConfig;
topicInfoManager = new DefaultTopicRuntimeDataManager(namesrvConfig);
namesrvConfigManager = new DefaultNamesrvConfigManager(namesrvConfig);
namesrvSync = new NamesrvSync(namesrvConfig, topicInfoManager);
namesrvClient = new NamesrvClient(namesrvConfig, nettyClientConfig, topicInfoManager);
pollingAddress = new PollingAddress(namesrvConfig);
}
public boolean initialize() {
// ��ӡ���������ò���
MixAll.printObjectProperties(log, namesrvConfig);
// ��ʼ��ͨ�Ų�
remotingServer = new NettyRemotingServer(nettyServerConfig);
// ��ʼ���̳߳�
requestsServerExecutor =
Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactory() {
private AtomicInteger threadIndex = new AtomicInteger(0);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "RequestsExecutorThread_" + threadIndex.incrementAndGet());
}
});
registerProcessor();
return topicInfoManager.init();
}
public void registerProcessor() {
remotingServer.registerDefaultProcessor(new AllRequestProcessor(this, topicInfoManager),
this.requestsServerExecutor);
}
public void start() throws Exception {
remotingServer.start();
namesrvSync.start();
namesrvClient.start();
pollingAddress.start();
}
public void shutdown() {
requestsServerExecutor.shutdown();
remotingServer.shutdown();
namesrvSync.shutdown();
topicInfoManager.shutdown();
namesrvClient.shutdown();
pollingAddress.shutdown();
}
}