我正在学习Netty和代码示例,用于https://github.com/normanmaurer/netty-in-action/tree/2.0-SNAPSHOT/chapter2中的第2章示例
我添加了另一个AnotherEchoServerHandler
扩展ChannelInboundHandlerAdapter
,在AnotherEchoServerHandler.channelRead
方法中,我将它更新为:
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
添加为:
ch.pipeline().addLast(new AnotherEchoServerHandler()).addLast(serverHandler);
与其他EchoServerHandler
一样,我现在有两个ChannelHandler
,我希望从每个ChannelHandler
打印一条消息,并从每个ChannelHandler
向客户端回传一条消息。
使用上述更改运行图书示例:
在服务器端,它记录:
[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!
在客户端,它记录:
Client received: Netty rocks!Netty rocks!
正如您所看到的,我得到了双方预期的信息,但我也在服务器端看到了警告:
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
这条警告消息是什么意思?如何避免它?
发布于 2021-04-07 09:56:50
和其他EchoServerHandler一样,我现在有两个ChannelHandler,我想从每个ChannelHandler打印一条消息,并从每个ChannelHandler向客户端回传一条消息。
EchoServerHandler
还将编写msg
。这将导致msg
在ChannelOutboundBuffer
中发布两次。
在写入EchoServerHandler
之前,可以删除AnotherEchoServerHandler
或调用AnotherEchoServerHandler
https://stackoverflow.com/questions/66869561
复制相似问题