/* * Copyright (C) 2012-2016 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.nifty.core; import com.google.common.base.Strings; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.Inject; import org.jboss.netty.channel.socket.ServerSocketChannelConfig; import org.jboss.netty.channel.socket.nio.NioSocketChannelConfig; import org.jboss.netty.util.Timer; import java.lang.reflect.Proxy; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; import static java.util.concurrent.Executors.newCachedThreadPool; /* * Hooks for configuring various parts of Netty. */ public class NettyServerConfigBuilder extends NettyConfigBuilderBase<NettyServerConfigBuilder> { private final NioSocketChannelConfig socketChannelConfig = (NioSocketChannelConfig) Proxy.newProxyInstance( getClass().getClassLoader(), new Class<?>[]{NioSocketChannelConfig.class}, new Magic("child.") ); private final ServerSocketChannelConfig serverSocketChannelConfig = (ServerSocketChannelConfig) Proxy.newProxyInstance( getClass().getClassLoader(), new Class<?>[]{ServerSocketChannelConfig.class}, new Magic("")); @Inject public NettyServerConfigBuilder() { // Thrift turns TCP_NODELAY by default, and turning it off can have latency implications // so let's turn it on by default as well. It can still be switched off by explicitly // calling setTcpNodelay(false) after construction. getSocketChannelConfig().setTcpNoDelay(true); } /** * Returns an implementation of {@link NioSocketChannelConfig} which will be applied to all * {@link org.jboss.netty.channel.socket.nio.NioSocketChannel} instances created to manage * connections accepted by the server. * * @return A mutable {@link NioSocketChannelConfig} */ public NioSocketChannelConfig getSocketChannelConfig() { return socketChannelConfig; } /** * Returns an implementation of {@link ServerSocketChannelConfig} * which will be applied to the {@link org.jboss.netty.channel.socket.ServerSocketChannel} * the server will use to accept connections. * * @return A mutable {@link ServerSocketChannelConfig} */ public ServerSocketChannelConfig getServerSocketChannelConfig() { return serverSocketChannelConfig; } public NettyServerConfig build() { Timer timer = getTimer(); ExecutorService bossExecutor = getBossExecutor(); int bossThreadCount = getBossThreadCount(); ExecutorService workerExecutor = getWorkerExecutor(); int workerThreadCount = getWorkerThreadCount(); return new NettyServerConfig( getBootstrapOptions(), timer != null ? timer : new NiftyTimer(threadNamePattern("")), bossExecutor != null ? bossExecutor : buildDefaultBossExecutor(), bossThreadCount, workerExecutor != null ? workerExecutor : buildDefaultWorkerExecutor(), workerThreadCount ); } private ExecutorService buildDefaultBossExecutor() { return newCachedThreadPool(renamingThreadFactory(threadNamePattern("-boss-%s"))); } private ExecutorService buildDefaultWorkerExecutor() { return newCachedThreadPool(renamingThreadFactory(threadNamePattern("-worker-%s"))); } private String threadNamePattern(String suffix) { String niftyName = getNiftyName(); return "nifty-server" + (Strings.isNullOrEmpty(niftyName) ? "" : "-" + niftyName) + suffix; } private ThreadFactory renamingThreadFactory(String nameFormat) { return new ThreadFactoryBuilder().setNameFormat(nameFormat).build(); } }