|
@@ -3,7 +3,6 @@ package hello;
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
import io.netty.buffer.Unpooled;
|
|
|
import io.netty.channel.ChannelFutureListener;
|
|
|
-import io.netty.channel.ChannelHandler;
|
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
|
import io.netty.channel.SimpleChannelInboundHandler;
|
|
|
import io.netty.handler.codec.http.DefaultFullHttpResponse;
|
|
@@ -13,6 +12,7 @@ import io.netty.handler.codec.http.HttpRequest;
|
|
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
|
|
import io.netty.handler.codec.http.HttpVersion;
|
|
|
import io.netty.util.CharsetUtil;
|
|
|
+import io.netty.util.concurrent.FastThreadLocal;
|
|
|
|
|
|
import java.text.DateFormat;
|
|
|
import java.text.SimpleDateFormat;
|
|
@@ -23,20 +23,16 @@ import java.util.concurrent.TimeUnit;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
|
|
|
|
|
|
[email protected]
|
|
|
public class HelloServerHandler extends SimpleChannelInboundHandler<Object> {
|
|
|
- private static final ThreadLocal<DateFormat> FORMAT = new ThreadLocal<DateFormat>() {
|
|
|
+ private static final FastThreadLocal<DateFormat> FORMAT = new FastThreadLocal<DateFormat>() {
|
|
|
@Override
|
|
|
protected DateFormat initialValue() {
|
|
|
return new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-
|
|
|
- private static final ByteBuf CONTENT_BUFFER = Unpooled.unreleasableBuffer(
|
|
|
- Unpooled.directBuffer().writeBytes("Hello, World!".getBytes(CharsetUtil.UTF_8)));
|
|
|
- private static final CharSequence contentLength = HttpHeaders.newEntity(
|
|
|
- String.valueOf(CONTENT_BUFFER.readableBytes()));
|
|
|
+ private static final ByteBuf CONTENT_BUFFER = Unpooled.unreleasableBuffer(Unpooled.directBuffer().writeBytes("Hello, World!".getBytes(CharsetUtil.UTF_8)));
|
|
|
+ private static final CharSequence contentLength = HttpHeaders.newEntity(String.valueOf(CONTENT_BUFFER.readableBytes()));
|
|
|
|
|
|
private static final CharSequence TYPE_PLAIN = HttpHeaders.newEntity("text/plain; charset=UTF-8");
|
|
|
private static final CharSequence TYPE_JSON = HttpHeaders.newEntity("application/json; charset=UTF-8");
|
|
@@ -76,8 +72,7 @@ public class HelloServerHandler extends SimpleChannelInboundHandler<Object> {
|
|
|
return;
|
|
|
case "/json":
|
|
|
byte[] json = MAPPER.writeValueAsBytes(new Message("Hello, World!"));
|
|
|
- writeResponse(ctx, request, Unpooled.wrappedBuffer(json), TYPE_JSON,
|
|
|
- String.valueOf(json.length));
|
|
|
+ writeResponse(ctx, request, Unpooled.wrappedBuffer(json), TYPE_JSON, String.valueOf(json.length));
|
|
|
return;
|
|
|
}
|
|
|
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.NOT_FOUND, Unpooled.EMPTY_BUFFER, false);
|
|
@@ -85,21 +80,16 @@ public class HelloServerHandler extends SimpleChannelInboundHandler<Object> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void writeResponse(ChannelHandlerContext ctx, HttpRequest request, ByteBuf buf,
|
|
|
- CharSequence contentType, CharSequence contentLength) {
|
|
|
+ private void writeResponse(ChannelHandlerContext ctx, HttpRequest request, ByteBuf buf, CharSequence contentType, CharSequence contentLength) {
|
|
|
// Decide whether to close the connection or not.
|
|
|
boolean keepAlive = HttpHeaders.isKeepAlive(request);
|
|
|
// Build the response object.
|
|
|
- FullHttpResponse response = new DefaultFullHttpResponse(
|
|
|
- HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf, false);
|
|
|
+ FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf, false);
|
|
|
HttpHeaders headers = response.headers();
|
|
|
headers.set(CONTENT_TYPE_ENTITY, contentType);
|
|
|
headers.set(SERVER_ENTITY, SERVER_NAME);
|
|
|
headers.set(DATE_ENTITY, date);
|
|
|
-
|
|
|
- if (keepAlive) {
|
|
|
- headers.set(CONTENT_LENGTH_ENTITY, contentLength);
|
|
|
- }
|
|
|
+ headers.set(CONTENT_LENGTH_ENTITY, contentLength);
|
|
|
|
|
|
// Close the non-keep-alive connection after the write operation is done.
|
|
|
if (!keepAlive) {
|
|
@@ -110,8 +100,7 @@ public class HelloServerHandler extends SimpleChannelInboundHandler<Object> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void exceptionCaught(
|
|
|
- ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|
|
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|
|
ctx.close();
|
|
|
}
|
|
|
|