/** * Copyright (C) 2010-2013 Alibaba Group Holding Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.rocketmq.namesrv; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.rocketmq.common.ThreadFactoryImpl; import com.alibaba.rocketmq.common.constant.LoggerName; import com.alibaba.rocketmq.common.namesrv.NamesrvConfig; import com.alibaba.rocketmq.namesrv.kvconfig.KVConfigManager; import com.alibaba.rocketmq.namesrv.processor.DefaultRequestProcessor; import com.alibaba.rocketmq.namesrv.routeinfo.BrokerHousekeepingService; import com.alibaba.rocketmq.namesrv.routeinfo.RouteInfoManager; import com.alibaba.rocketmq.remoting.RemotingServer; import com.alibaba.rocketmq.remoting.netty.NettyRemotingServer; import com.alibaba.rocketmq.remoting.netty.NettyServerConfig; /** * Name Server服务控制 * * @author shijia.wxr<[email protected]> * @since 2013-7-5 */ public class NamesrvController { private static final Logger log = LoggerFactory.getLogger(LoggerName.NamesrvLoggerName); // Name Server配置 private final NamesrvConfig namesrvConfig; // 通信层配置 private final NettyServerConfig nettyServerConfig; // 服务端通信层对象 private RemotingServer remotingServer; // 接收Broker连接事件 private BrokerHousekeepingService brokerHousekeepingService; // 服务端网络请求处理线程池 private ExecutorService remotingExecutor; // 定时线程 private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("NSScheduledThread")); /** * 核心数据结构 */ private final KVConfigManager kvConfigManager; private final RouteInfoManager routeInfoManager; public NamesrvController(NamesrvConfig namesrvConfig, NettyServerConfig nettyServerConfig) { this.namesrvConfig = namesrvConfig; this.nettyServerConfig = nettyServerConfig; this.kvConfigManager = new KVConfigManager(this); this.routeInfoManager = new RouteInfoManager(); this.brokerHousekeepingService = new BrokerHousekeepingService(this); } 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(); // 增加定时任务 this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.routeInfoManager.scanNotActiveBroker(); } }, 5, 10, TimeUnit.SECONDS); 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; } private void registerProcessor() { this.remotingServer.registerDefaultProcessor(new DefaultRequestProcessor(this), this.remotingExecutor); } public void start() throws Exception { this.remotingServer.start(); } public void shutdown() { this.remotingServer.shutdown(); this.remotingExecutor.shutdown(); this.scheduledExecutorService.shutdown(); } public NamesrvConfig getNamesrvConfig() { return namesrvConfig; } public NettyServerConfig getNettyServerConfig() { return nettyServerConfig; } public KVConfigManager getKvConfigManager() { return kvConfigManager; } public RouteInfoManager getRouteInfoManager() { return routeInfoManager; } public RemotingServer getRemotingServer() { return remotingServer; } public void setRemotingServer(RemotingServer remotingServer) { this.remotingServer = remotingServer; } }