gpt4 book ai didi

java - ResourceLeakDetector.setLevel(PARANOID) 不生成资源泄漏日志

转载 作者:行者123 更新时间:2023-12-01 17:30:17 28 4
gpt4 key购买 nike

我实现了一个 netty 4 http 服务器。

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 管道工厂类是 -

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 是 -

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 中 -

    public class Main {
public static void main(String[] args) {
ResourceLeakDetector.setLevel(PARANOID);
HttpServer server = new HttpServer(5020);
server.start();
}
}

正如您在主应用程序中看到的那样,我设置了 ResourceLeakDetector.setLevel(PARANOID); 但我在应用程序日志中没有看到任何资源泄漏检测日志。

我缺少什么。我该如何解决这个问题?

最佳答案

我在您的代码中没有看到任何泄漏,因此没有报告泄漏是有道理的。只需将 SimpleChannelInboundHandler 替换为 ChannelInboundHandlerAdaptor 或在 channelRead0(...) 方法中调用 request.retain() 即可您将看到一份报告。

关于java - ResourceLeakDetector.setLevel(PARANOID) 不生成资源泄漏日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61134849/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com