首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于警告的问题:未能发布消息:PooledUnsafeDirectByteBuf(已释放)

关于警告的问题:未能发布消息:PooledUnsafeDirectByteBuf(已释放)
EN

Stack Overflow用户
提问于 2021-03-30 10:48:53
回答 1查看 653关注 0票数 0

我正在学习Netty和代码示例,用于https://github.com/normanmaurer/netty-in-action/tree/2.0-SNAPSHOT/chapter2中的第2章示例

我添加了另一个AnotherEchoServerHandler扩展ChannelInboundHandlerAdapter,在AnotherEchoServerHandler.channelRead方法中,我将它更新为:

代码语言:javascript
运行
复制
public void channelRead(ChannelHandlerContext ctx, Object msg) {
    ByteBuf in = (ByteBuf) msg;
    System.out.println(
            "Log from AnotherEchoServerHandler that Server received: " + in.toString(CharsetUtil.UTF_8));
    ctx.fireChannelRead(msg);
    ctx.write(in);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx)
        throws Exception {
    ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
            .addListener(ChannelFutureListener.CLOSE);
}

EchoServer中,我将新的ChannelHandler添加为:

代码语言:javascript
运行
复制
 ch.pipeline().addLast(new AnotherEchoServerHandler()).addLast(serverHandler);

与其他EchoServerHandler一样,我现在有两个ChannelHandler,我希望从每个ChannelHandler打印一条消息,并从每个ChannelHandler向客户端回传一条消息。

使用上述更改运行图书示例:

在服务器端,它记录:

代码语言:javascript
运行
复制
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ echo-server ---
nia.chapter2.echoserver.EchoServer started and listening for connections on /0:0:0:0:0:0:0:0:8888
Log from AnotherEchoServerHandler that Server received: Netty rocks!
Server received: Netty rocks!

在客户端,它记录:

代码语言:javascript
运行
复制
Client received: Netty rocks!Netty rocks!

正如您所看到的,我得到了双方预期的信息,但我也在服务器端看到了警告:

代码语言:javascript
运行
复制
Mar 30, 2021 6:25:29 PM io.netty.util.ReferenceCountUtil safeRelease
WARNING: Failed to release a message: PooledUnsafeDirectByteBuf(freed)
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:101)
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:89)
    at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84)
    at io.netty.util.ReferenceCountUtil.safeRelease(ReferenceCountUtil.java:109)
    at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:256)
    at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:337)
    at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:448)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1296)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802)
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)
    at nia.chapter2.echoserver.AnotherEchoServerHandler.channelReadComplete(AnotherEchoServerHandler.java:30)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:398)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:380)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelReadComplete(AbstractChannelHandlerContext.java:373)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelReadComplete(DefaultChannelPipeline.java:1339)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:398)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:380)
    at io.netty.channel.DefaultChannelPipeline.fireChannelReadComplete(DefaultChannelPipeline.java:932)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:139)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:458)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
    at java.lang.Thread.run(Thread.java:748

这条警告消息是什么意思?如何避免它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-07 09:56:50

和其他EchoServerHandler一样,我现在有两个ChannelHandler,我想从每个ChannelHandler打印一条消息,并从每个ChannelHandler向客户端回传一条消息。

EchoServerHandler还将编写msg。这将导致msgChannelOutboundBuffer中发布两次。

在写入EchoServerHandler之前,可以删除AnotherEchoServerHandler或调用AnotherEchoServerHandler

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66869561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档