package com.tesora.dve.standalone; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.util.concurrent.DefaultThreadFactory; import io.netty.util.internal.logging.InternalLoggerFactory; import io.netty.util.internal.logging.Log4JLoggerFactory; import java.util.Properties; import org.apache.log4j.Logger; import com.tesora.dve.common.PEConstants; import com.tesora.dve.common.PEFileUtils; import com.tesora.dve.parlb.LoadBalancerProxyInitializer; public class LoadBalancer { private static Logger logger = Logger.getLogger(LoadBalancer.class); private static final String PORT_PROPERTY = "loadbalancer.port"; private LoadBalancerProxyInitializer proxyInitializer; private int lbPort; public LoadBalancer(Properties props) throws Exception { proxyInitializer = new LoadBalancerProxyInitializer(props); lbPort = props.contains(PORT_PROPERTY) ? Integer.parseInt(props.getProperty(PORT_PROPERTY)) : proxyInitializer.getDefaultPort(); logger.info("Starting Tesora DVE load balancer using:"); logger.info("... balancer port : " + lbPort); } public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(0, new DefaultThreadFactory("lb-boss")); EventLoopGroup workerGroup = new NioEventLoopGroup(0, new DefaultThreadFactory("lb-worker")); ServerBootstrap b = new ServerBootstrap(); try { b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(proxyInitializer) .childOption(ChannelOption.AUTO_READ, false) .bind(lbPort).sync().channel().closeFuture().sync(); } catch (Throwable e) { throw new Exception("Failed to start load balancer on port " + lbPort, e); } finally { // b.shutdown(); bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); proxyInitializer.close(); } } public static void main(String[] args) throws Exception { Properties props = PEFileUtils.loadPropertiesFile(LoadBalancer.class, PEConstants.CONFIG_FILE_NAME); if (args.length == 2 && "-port".equalsIgnoreCase(args[0])) props.setProperty(PORT_PROPERTY, args[1]); else if (args.length > 0) throw new Exception("Usage: LoadBalancer [-port <port>]"); InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory()); LoadBalancer loadBalancer = new LoadBalancer(props); loadBalancer.run(); } }