package code.google.nfs.rpc.netty.server;
/**
* nfs-rpc
* Apache License
*
* http://code.google.com/p/nfs-rpc (c) 2011
*/
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.DefaultChannelPipeline;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import code.google.nfs.rpc.NamedThreadFactory;
import code.google.nfs.rpc.ProtocolFactory;
import code.google.nfs.rpc.netty.serialize.NettyProtocolDecoder;
import code.google.nfs.rpc.netty.serialize.NettyProtocolEncoder;
import code.google.nfs.rpc.server.Server;
/**
* Netty Server
*
* @author <a href="mailto:bluedavy@gmail.com">bluedavy</a>
*/
public class NettyServer implements Server {
private static final Log LOGGER = LogFactory.getLog(NettyServer.class);
private ServerBootstrap bootstrap = null;
private AtomicBoolean startFlag = new AtomicBoolean(false);
public NettyServer() {
ThreadFactory serverBossTF = new NamedThreadFactory("NETTYSERVER-BOSS-");
ThreadFactory serverWorkerTF = new NamedThreadFactory("NETTYSERVER-WORKER-");
bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(serverBossTF),
Executors.newCachedThreadPool(serverWorkerTF)));
bootstrap.setOption("tcpNoDelay", Boolean.parseBoolean(System.getProperty("nfs.rpc.tcp.nodelay", "true")));
bootstrap.setOption("reuseAddress", Boolean.parseBoolean(System.getProperty("nfs.rpc.tcp.reuseaddress", "true")));
}
public void start(int listenPort, final ExecutorService threadPool) throws Exception {
if(!startFlag.compareAndSet(false, true)){
return;
}
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = new DefaultChannelPipeline();
pipeline.addLast("decoder", new NettyProtocolDecoder());
pipeline.addLast("encoder", new NettyProtocolEncoder());
pipeline.addLast("handler", new NettyServerHandler(threadPool));
return pipeline;
}
});
bootstrap.bind(new InetSocketAddress(listenPort));
LOGGER.warn("Server started,listen at: "+listenPort);
}
public void registerProcessor(int protocolType,String serviceName, Object serviceInstance) {
ProtocolFactory.getServerHandler(protocolType).registerProcessor(serviceName, serviceInstance);
}
public void stop() throws Exception {
LOGGER.warn("Server stop!");
bootstrap.releaseExternalResources();
startFlag.set(false);
}
}