package code.google.nfs.rpc.mina2.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.atomic.AtomicBoolean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import code.google.nfs.rpc.ProtocolFactory;
import code.google.nfs.rpc.mina2.serialize.MinaProtocolCodecFilter;
import code.google.nfs.rpc.server.Server;
/**
* Mina2 Server
*
* @author <a href="mailto:bluedavy@gmail.com">bluedavy</a>
*/
public class MinaServer implements Server {
private static final Log LOGGER = LogFactory.getLog(MinaServer.class);
private IoAcceptor acceptor;
private AtomicBoolean startFlag = new AtomicBoolean();
private MinaServerHandler serverHandler = null;
public MinaServer(){
acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1);
((NioSocketAcceptor)acceptor).setReuseAddress(true);
((NioSocketAcceptor)acceptor).getSessionConfig().setTcpNoDelay(true);
// acceptor.getFilterChain().addLast("executor", new ExecutorFilter(5, 10));
acceptor.getFilterChain().addLast("objectserialize", new MinaProtocolCodecFilter());
}
public void start(int listenPort, ExecutorService businessThreadPool)
throws Exception {
if(!startFlag.compareAndSet(false, true)){
return;
}
try{
serverHandler = new MinaServerHandler(businessThreadPool);
acceptor.setHandler(serverHandler);
acceptor.bind(new InetSocketAddress(listenPort));
LOGGER.warn("Server started,listen at: "+listenPort);
}
catch(Exception e){
startFlag.set(false);
LOGGER.error("Server start failed",e);
throw new Exception("start server error",e);
}
}
public void registerProcessor(int protocolType,String serviceName,Object serviceInstance){
ProtocolFactory.getServerHandler(protocolType).registerProcessor(serviceName, serviceInstance);
}
public void stop() throws Exception {
serverHandler = null;
LOGGER.warn("Server stoped");
acceptor.dispose();
startFlag.set(false);
}
}