package code.google.nfs.rpc.grizzly.server;
/**
* nfs-rpc
* Apache License
*
* http://code.google.com/p/nfs-rpc (c) 2011
*/
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.glassfish.grizzly.filterchain.FilterChainBuilder;
import org.glassfish.grizzly.filterchain.TransportFilter;
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;
import org.glassfish.grizzly.threadpool.ThreadPoolConfig;
import code.google.nfs.rpc.ProtocolFactory;
import code.google.nfs.rpc.grizzly.serialize.GrizzlyProtocolFilter;
import code.google.nfs.rpc.server.Server;
import org.glassfish.grizzly.strategies.SameThreadIOStrategy;
import org.glassfish.grizzly.threadpool.GrizzlyExecutorService;
/**
* Grizzly Server
*
* @author <a href="mailto:bluedavy@gmail.com">bluedavy</a>
*/
public class GrizzlyServer implements Server {
private static final Log LOGGER = LogFactory.getLog(GrizzlyServer.class);
private TCPNIOTransport transport = null;
public void start(int listenPort, ExecutorService threadpool) throws Exception {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) threadpool;
ThreadPoolConfig config = ThreadPoolConfig.defaultConfig().copy()
.setCorePoolSize(threadPoolExecutor.getCorePoolSize())
.setMaxPoolSize(threadPoolExecutor.getMaximumPoolSize())
.setPoolName("GRIZZLY-SERVER");
ExecutorService executorService =
GrizzlyExecutorService.createInstance(config);
FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();
filterChainBuilder.add(new TransportFilter());
filterChainBuilder.add(new GrizzlyProtocolFilter());
filterChainBuilder.add(new GrizzlyServerHandler(executorService));
TCPNIOTransportBuilder builder = TCPNIOTransportBuilder.newInstance();
builder.setOptimizedForMultiplexing(true);
builder.setIOStrategy(SameThreadIOStrategy.getInstance());
transport = builder.build();
transport.setProcessor(filterChainBuilder.build());
transport.bind(listenPort);
transport.start();
LOGGER.warn("server started,listen at: " + listenPort);
}
public void stop() throws Exception {
if (transport != null) {
transport.stop();
LOGGER.warn("server stoped!");
}
}
public void registerProcessor(int protocolType, String serviceName, Object serviceInstance) {
ProtocolFactory.getServerHandler(protocolType).registerProcessor(serviceName, serviceInstance);
}
}