package org.langke.core.server;
import java.util.concurrent.TimeUnit;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelUpstreamHandler;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
import org.jboss.netty.handler.codec.http.HttpMethod;
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
import org.jboss.netty.handler.stream.ChunkedWriteHandler;
import org.jboss.netty.handler.timeout.ReadTimeoutHandler;
import org.jboss.netty.handler.timeout.WriteTimeoutHandler;
import org.jboss.netty.util.HashedWheelTimer;
import org.jboss.netty.util.Timer;
import org.langke.common.Config;
import org.langke.common.server.BaseNioServer;
import org.langke.common.server.Handler;
import org.langke.common.server.NettyHttpRequest;
import org.langke.common.server.RestChannelHandler;
import org.langke.common.server.ServerAddress;
import org.langke.common.server.resp.Resp;
import org.langke.core.handler.DemoHandler;
import org.langke.util.logging.ESLogger;
import org.langke.util.logging.Loggers;
/**
*
* @author langke
* @date 2012-9-11
*
*/
public class RestNettyServer extends BaseNioServer {
private static ESLogger log = Loggers.getLogger(RestNettyServer.class);
private RestChannelHandler restHandler = null;
public RestNettyServer() {
restHandler = new RestChannelHandler();
restHandler.registerHandler(HttpMethod.GET, "/", new Handler() {
@Override
public Resp handleRequest(NettyHttpRequest request) {
return new Resp("rest netty server 0.1");
}
});
DemoHandler demo = new DemoHandler();
//Handler demo = net.bull.javamelody.MonitoringProxy.createProxy(new DemoHandler());
restHandler.registerHandler(HttpMethod.GET, "/demo/{label}", demo);
restHandler.registerHandler(HttpMethod.POST, "/demo/{label}", demo);
}
@Override
protected ChannelPipelineFactory getChannelPipelineFactory() {
final Timer timer = new HashedWheelTimer(Config.get().getInt("readTimeout", 60), TimeUnit.SECONDS);
return new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("readTimeout", new ReadTimeoutHandler(timer, Config.get().getInt("readTimeout", 60)));
pipeline.addLast("writeTimeout", new WriteTimeoutHandler(timer, Config.get().getInt("writeTimeout", 60)));
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());
pipeline.addLast("query", restHandler);
return pipeline;
}
};
}
@Override
protected int defaultPort() {
return 9005;
}
@Override
public String serverName() {
return Config.get().get("server.name", "rest-netty-server");
}
@Override
public void init() {
super.init();
}
@Override
public void start() {
super.start();
}
protected ServerAddress getServerAddress() {
String listen = Config.get().get("server.listen");
String address = Config.get().get("server.listen.address");
String port = Config.get().get("server.listen.port");
if(listen != null){
return new ServerAddress(listen);
}
return new ServerAddress(address, (port!=null?Integer.parseInt(port):defaultPort()));
}
@Override
protected ChannelUpstreamHandler finalChannelUpstreamHandler() {
return null;
}
public static void main(String[] args) {
SpringApplicationContext.getInstance();
final RestNettyServer o = new RestNettyServer();
o.init();
o.start();
new JavaMelodyMonitorServer(o.serverName(),o.getServerAddress().getHost(),o.getServerAddress().getPort());
}
}