package com.zy.acs.gateway; import com.zy.acs.gateway.config.SystemProperties; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; 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.ResourceLeakDetector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * TCP/IP协议端口 * Netty Server 引导类 * @author Vincent */ @Component public class OnlineServer { private static final Logger log = LoggerFactory.getLogger(OnlineServer.class); private final HandlerInitializer handlerInitializer; private final SystemProperties systemProperties; private Channel channel; private ServerBootstrap bootstrap; private EventLoopGroup bossGroup; private EventLoopGroup workerGroup; @Autowired public OnlineServer(SystemProperties systemProperties, HandlerInitializer handlerInitializer) { ; this.systemProperties = systemProperties; this.handlerInitializer = handlerInitializer; } { bootstrap = new ServerBootstrap(); bossGroup = new NioEventLoopGroup(1); workerGroup = new NioEventLoopGroup(); } /** * tcp server init */ @PostConstruct public void serverStart() throws Exception { bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(handlerInitializer) .option(ChannelOption.SO_BACKLOG, systemProperties.getBacklog()) .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT) .childOption(ChannelOption.SO_KEEPALIVE, systemProperties.isKeepAlive()) .childOption(ChannelOption.SO_SNDBUF, systemProperties.getSndbuf()) .childOption(ChannelOption.SO_RCVBUF, systemProperties.getRcvbuf()); ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED); log.info("TCP server started successfully, port:{}", systemProperties.getPort()); channel = bootstrap.bind(systemProperties.getPort()).sync().channel(); } /** * tcp server stop */ @PreDestroy public void destroy() { if (channel != null && channel.isActive()) { channel.close(); } if (bossGroup != null) { bossGroup.shutdownGracefully(); } if (workerGroup != null) { workerGroup.shutdownGracefully(); } log.info("TCP server stopped successfully, port: {}", systemProperties.getPort()); } }