/** * 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.ThreadFactory; import java.util.concurrent.TimeUnit; 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.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<vintage.wang@gmail.com> * @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 ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(r, "NamesrvControllerScheduledThread"); } }); /** * 核心数据结构 */ 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() { // 打印服务器配置参数 MixAll.printObjectProperties(log, this.namesrvConfig); // 加载KV配置 this.kvConfigManager.load(); // 初始化通信层 this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService); // 初始化线程池 this.remotingExecutor = Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactory() { private AtomicInteger threadIndex = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { return new Thread(r, "RemotingExecutorThread_" + threadIndex.incrementAndGet()); } }); this.registerProcessor(); // 增加定时任务 this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.routeInfoManager.scanNotActiveBroker(); } }, 1000 * 5, 1000 * 10, TimeUnit.MILLISECONDS); this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.kvConfigManager.printAllPeriodically(); } }, 1000 * 10, 1000 * 120, TimeUnit.MILLISECONDS); this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { NamesrvController.this.routeInfoManager.printAllPeriodically(); } }, 1000 * 10, 1000 * 120, TimeUnit.MILLISECONDS); 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; } }