/** * Dianping.com Inc. * Copyright (c) 2003-2013 All Rights Reserved. */ package com.dianping.pigeon.remoting.provider; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.dianping.pigeon.config.ConfigManager; import com.dianping.pigeon.config.ConfigManagerLoader; import com.dianping.pigeon.extension.ExtensionLoader; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.log.LoggerLoader; import com.dianping.pigeon.monitor.Monitor; import com.dianping.pigeon.monitor.MonitorLoader; import com.dianping.pigeon.registry.RegistryManager; import com.dianping.pigeon.registry.exception.RegistryException; import com.dianping.pigeon.remoting.common.codec.SerializerFactory; import com.dianping.pigeon.remoting.common.util.Constants; import com.dianping.pigeon.remoting.provider.config.ProviderConfig; import com.dianping.pigeon.remoting.provider.config.ServerConfig; import com.dianping.pigeon.remoting.provider.listener.ShutdownHookListener; import com.dianping.pigeon.remoting.provider.process.ProviderProcessHandlerFactory; import com.dianping.pigeon.remoting.provider.publish.ServicePublisher; import com.dianping.pigeon.util.ClassUtils; import com.dianping.pigeon.util.NetUtils; import com.dianping.pigeon.util.VersionUtils; public final class ProviderBootStrap { private static Logger logger = LoggerLoader.getLogger(ServicePublisher.class); static Server httpServer = null; static volatile Map<String, Server> serversMap = new HashMap<String, Server>(); static volatile boolean isInitialized = false; static Date startTime = new Date(); public static Date getStartTime() { return startTime; } public static void init() { if (!isInitialized) { synchronized (ProviderBootStrap.class) { if (!isInitialized) { ProviderProcessHandlerFactory.init(); SerializerFactory.init(); ClassUtils.loadClasses("com.dianping.pigeon"); Thread shutdownHook = new Thread(new ShutdownHookListener()); shutdownHook.setDaemon(true); shutdownHook.setPriority(Thread.MAX_PRIORITY); Runtime.getRuntime().addShutdownHook(shutdownHook); ServerConfig config = new ServerConfig(); config.setProtocol(Constants.PROTOCOL_HTTP); RegistryManager.getInstance(); List<Server> servers = ExtensionLoader.getExtensionList(Server.class); for (Server server : servers) { if (!server.isStarted()) { if (server.support(config)) { server.start(config); registerConsoleServer(config); initRegistryConfig(config); httpServer = server; serversMap.put(server.getProtocol() + server.getPort(), server); logger.warn("pigeon " + server + "[version:" + VersionUtils.VERSION + "] has been started"); } } } isInitialized = true; } } } } public static ServerConfig startup(ProviderConfig<?> providerConfig) { ServerConfig serverConfig = providerConfig.getServerConfig(); if (serverConfig == null) { throw new IllegalArgumentException("server config is required"); } Server server = serversMap.get(serverConfig.getProtocol() + serverConfig.getPort()); if (server != null) { server.addService(providerConfig); return server.getServerConfig(); } else { synchronized (ProviderBootStrap.class) { List<Server> servers = ExtensionLoader.newExtensionList(Server.class); for (Server s : servers) { if (!s.isStarted()) { if (s.support(serverConfig)) { s.start(serverConfig); s.addService(providerConfig); serversMap.put(s.getProtocol() + serverConfig.getPort(), s); logger.warn("pigeon " + s + "[version:" + VersionUtils.VERSION + "] has been started"); break; } } } server = serversMap.get(serverConfig.getProtocol() + serverConfig.getPort()); if (server != null) { server.getRequestProcessor().getRequestProcessThreadPool().prestartAllCoreThreads(); return server.getServerConfig(); } return null; } } } public static void shutdown() { for (Server server : serversMap.values()) { if (server != null) { logger.info("start to stop " + server); try { unregisterConsoleServer(server.getServerConfig()); server.stop(); } catch (Throwable e) { } if (logger.isInfoEnabled()) { logger.info(server + " has been shutdown"); } } } try { ProviderProcessHandlerFactory.destroy(); } catch (Throwable e) { } } public static List<Server> getServers(ProviderConfig<?> providerConfig) { List<Server> servers = new ArrayList<Server>(); servers.add(httpServer); String protocol = providerConfig.getServerConfig().getProtocol(); int port = providerConfig.getServerConfig().getPort(); servers.add(serversMap.get(protocol + port)); return servers; } public static Map<String, Server> getServersMap() { return serversMap; } public static Server getHttpServer() { return httpServer; } private static void initRegistryConfig(ServerConfig config) { try { RegistryManager.getInstance().initRegistryConfig(config.getIp()); } catch (RegistryException e) { logger.warn("failed to init registry config, set config to blank, please check!", e); } } public static void registerConsoleServer(ServerConfig config) { RegistryManager.getInstance().setConsoleAddress(NetUtils.toAddress(config.getIp(), config.getHttpPort())); } public static void unregisterConsoleServer(ServerConfig config) { if (Constants.PROTOCOL_HTTP.equals(config.getProtocol())) { RegistryManager.getInstance().unregisterConsoleAddress(NetUtils.toAddress(config.getIp(), config.getHttpPort())); } } }