package code.google.nfs.rpc.mina.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.common.IoAcceptor; import org.apache.mina.common.ThreadModel; import org.apache.mina.transport.socket.nio.SocketAcceptor; import code.google.nfs.rpc.NamedThreadFactory; import code.google.nfs.rpc.ProtocolFactory; import code.google.nfs.rpc.mina.serialize.MinaProtocolCodecFilter; import code.google.nfs.rpc.server.Server; /** * Mina 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 static final String ACCEPTOR_THREADNAME = "MINASERVER-ACCEPTOR"; private IoAcceptor acceptor; private AtomicBoolean startFlag = new AtomicBoolean(); private MinaServerHandler serverHandler = null; public MinaServer(){ acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool(new NamedThreadFactory(ACCEPTOR_THREADNAME))); acceptor.getDefaultConfig().setThreadModel(ThreadModel.MANUAL); acceptor.getDefaultConfig().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.bind(new InetSocketAddress(listenPort), serverHandler); 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.unbindAll(); startFlag.set(false); } }