package dgm.driver.server;
import com.google.inject.*;
import org.apache.commons.lang3.StringUtils;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.concurrent.Executors;
/**
* Configure some pretty standard netty options
*/
public class ServerModule extends AbstractModule
{
final int port;
final String host;
public ServerModule(String host, int port)
{
this.host = host;
this.port = port;
}
@Override
protected final void configure()
{
if (StringUtils.isEmpty(host)) {
bind(SocketAddress.class).toInstance(new InetSocketAddress(port));
} else {
try {
bind(SocketAddress.class).toInstance(new InetSocketAddress(InetAddress.getByName(host), port));
} catch (UnknownHostException e) {
throw new RuntimeException("Can't find address: "+host,e);
}
}
}
@Provides
@Inject
@Singleton
final ServerBootstrap provideServerBootstrap(ChannelFactory channelFactory, Provider<ChannelPipeline> pipelineProvider)
{
final ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);
// adapt a Provider<ChannelPipeline> into a ChannelPipelineFactory
bootstrap.setPipelineFactory(new ProviderPipelineFactory(pipelineProvider));
bootstrap.setOption("connectTimeoutMillis", 2000);
bootstrap.setOption("backlog", 1000);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
return bootstrap;
}
@Provides @Inject @Singleton
final ChannelFactory provideChannelFactory()
{
// NIO channels
return new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()
);
}
// provider -> factory
static class ProviderPipelineFactory implements ChannelPipelineFactory
{
final Provider<ChannelPipeline> pipeline;
public ProviderPipelineFactory(Provider<ChannelPipeline> pipeline)
{
this.pipeline = pipeline;
}
public ChannelPipeline getPipeline() throws Exception
{
return pipeline.get();
}
}
}