Java tutorial
package com.miko.s4netty.config; import com.miko.s4netty.worker.WorkerInitializer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * The MIT License * * Copyright 2014 Miroslav Kopecky. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @author miroslavkopecky */ @Configuration @ComponentScan("com.miko.s4netty") @PropertySource("classpath:worker-server.properties") public class WorkerNettyConfig { @Value("${boss.thread.count}") private int bossCount; @Value("${worker.thread.count}") private int workerCount; @Value("${tcp.port}") private int tcpPort; @Value("${worker.keepAlive}") private boolean keepAlive; @Value("${log4j.configuration}") private String log4jConfiguration; @Autowired @Qualifier("workerInitializer") private WorkerInitializer workerInitializer; private final Logger logger = LoggerFactory.getLogger(WorkerNettyConfig.class); @SuppressWarnings("unchecked") @Bean(name = "serverBootstrap") public ServerBootstrap bootstrap() { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup(), workerGroup()).channel(NioServerSocketChannel.class).childHandler(workerInitializer); Map<ChannelOption<?>, Object> tcpChannelOptions = tcpChannelOptions(); Set<ChannelOption<?>> keySet = tcpChannelOptions.keySet(); for (@SuppressWarnings("rawtypes") ChannelOption option : keySet) { b.option(option, tcpChannelOptions.get(option)); } return b; } @Bean(name = "bossGroup", destroyMethod = "shutdownGracefully") public NioEventLoopGroup bossGroup() { return new NioEventLoopGroup(bossCount); } @Bean(name = "workerGroup", destroyMethod = "shutdownGracefully") public NioEventLoopGroup workerGroup() { return new NioEventLoopGroup(workerCount); } @Bean(name = "tcpSocketAddress") public InetSocketAddress tcpPort() { logger.debug("tcpPort = " + tcpPort); return new InetSocketAddress(tcpPort); } @Bean(name = "tcpChannelOptions") public Map<ChannelOption<?>, Object> tcpChannelOptions() { Map<ChannelOption<?>, Object> options = new HashMap<>(); options.put(ChannelOption.SO_REUSEADDR, true); options.put(ChannelOption.SO_KEEPALIVE, keepAlive); logger.debug("tcpChannelOptions = " + options); return options; } /** * IMPORTANT: quite necessary to make the Value annotations work. * * @return */ @Bean public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }