问题描述
我有一个实施了netty 4的http服务器.
I have a netty 4 http server Implemented.
public void start() {
System.out.println("In Start method");
try {
ServerBootstrap b = new ServerBootstrap();
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new HttpServerPipelineFactory())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, WriteBufferWaterMark.DEFAULT)
.childOption(ChannelOption.AUTO_READ, false)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = b.bind(listenerPort).sync();
System.out.println("server started listening on port " + listenerPort);
f.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
}
}
HTTP管道工厂类为-
HTTP pipeline factory class is -
public class HttpServerPipelineFactory extends ChannelInitializer<Channel> {
@Override
protected void initChannel(Channel ch) {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("codec", new HttpServerCodec());
pipeline.addLast("compress", new HttpContentCompressor());
pipeline.addLast("decompress", new HttpContentDecompressor());
pipeline.addLast("aggregator", new HttpObjectAggregator( 512 * 1024));
pipeline.addLast("chunked", new ChunkedWriteHandler());
pipeline.addLast("flow", new FlowControlHandler());
pipeline.addLast("keep-alive", new HttpServerKeepAliveHandler());
pipeline.addLast("request", new AdvancedHTTPHandler());
}
}
AdvancedHTTPHandler是-
AdvancedHTTPHandler is -
import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
import static io.netty.util.CharsetUtil.UTF_8;
public class AdvancedHTTPHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
private static Logger logger = LoggerFactory.getLogger(HTTPRequestHandler.class);
@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.copiedBuffer("My Netty".getBytes()), false);
response.headers().add(request.headers());
response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
ctx.channel().writeAndFlush(response);
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
ctx.read();
}
}
在Main.java中-
In the Main.java -
public class Main {
public static void main(String[] args) {
ResourceLeakDetector.setLevel(PARANOID);
HttpServer server = new HttpServer(5020);
server.start();
}
}
正如您在主应用程序中所看到的那样,我已经设置了ResourceLeakDetector.setLevel(PARANOID);
,但是在我的应用程序日志中没有看到任何资源泄漏检测日志.
As you see in the Main application, I've set ResourceLeakDetector.setLevel(PARANOID);
but I don't see any resource leak detection logs in my application logs.
我想念的是什么.我该如何解决这个问题?
what is that I'm missing. How can I fix this issue?
推荐答案
我在您的代码中看不到任何泄漏,因此没有泄漏报告是有道理的.只需将SimpleChannelInboundHandler
替换为ChannelInboundHandlerAdaptor
或在channelRead0(...)
方法中调用request.retain()
,您就会看到报告.
I don't see any leaks in your code so it makes sense that there is no leak reported. Just replace SimpleChannelInboundHandler
with ChannelInboundHandlerAdaptor
or call request.retain()
in your channelRead0(...)
method and you will see a report.
这篇关于ResourceLeakDetector.setLevel(PARANOID)没有产生资源泄漏日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!