package com.alibaba.doris.dataserver.net.netty; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import org.jboss.netty.channel.ChannelHandler.Sharable; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.DefaultChannelGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.doris.dataserver.ApplicationContext; import com.alibaba.doris.dataserver.config.ModuleConstances; import com.alibaba.doris.dataserver.net.NetworkModule; /** * 本handler为单例的handler。 * * @author ajun Email:jack.yuj@alibaba-inc.com */ @Sharable public class CollectConnectionInfoHandler extends SimpleChannelUpstreamHandler { public CollectConnectionInfoHandler(ApplicationContext appContext) { networkModule = (NetworkModule) appContext.getModuleByName(ModuleConstances.NETWORK_MODULE); } @Override public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { activeChannels.add(e.getChannel()); if (logger.isDebugEnabled()) { logger.debug("Open new connection : " + e.getChannel().getRemoteAddress()); } // 如果连接数过大,停止响应新的连接请求 if (activeChannels.size() > networkModule.getMaxConnections()) { Channels.close(e.getChannel()); logger.error("Too many connections has established."); } } @Override public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { if (logger.isDebugEnabled()) { logger.debug("Close connection : " + e.getChannel().getRemoteAddress()); } super.channelClosed(ctx, e); } public ChannelGroup getActiveChannels() { return activeChannels; } private NetworkModule networkModule; private ChannelGroup activeChannels = new DefaultChannelGroup(); private static final Logger logger = LoggerFactory.getLogger(CollectConnectionInfoHandler.class); }