新手:发出警告:WARN io.netty.util.ReferenceCountUtil-无法发布消息 [英] Newbie: Tripped a warning: WARN io.netty.util.ReferenceCountUtil - Failed to release a message

查看:1380
本文介绍了新手:发出警告:WARN io.netty.util.ReferenceCountUtil-无法发布消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Netty 4.1.6(io.netty:netty-all:4.1.6.在OS X 10.11.6上使用Java 1.8.0_102通过jcenter()从Gradle最终版)声明警告,但这实际上导致我的代码没有做正确的事.对Netty完全陌生,我几乎肯定会搞砸了,所以我想请教专家.

Netty 4.1.6 (io.netty:netty-all:4.1.6.Final from Gradle via jcenter() with Java 1.8.0_102 on OS X 10.11.6) claims this is a warning, but it actually causes my code not to do the right thing. Being totally new to Netty, I'm almost certainly screwing something up, so I thought I'd ask the experts.

我得到:

[nioEventLoopGroup-2-1] WARN io.netty.util.ReferenceCountUtil - Failed to release a message: DatagramPacket(=> /127.0.0.1:54169, PooledUnsafeDirectByteBuf(freed))
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1

来自此代码:

public void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
    ByteBuf bb = Unpooled.copiedBuffer(packet.content());

    String ssHex = javax.xml.bind.DatatypeConverter.printHexBinary(bb.array());     
    System.out.println("IP:"+packet.sender()+":"+packet.recipient()+":"+ssHex);

    DatagramPacket udpPacket = new DatagramPacket(packet.content(), packet.sender());  // Using this line causes the exception at write
    //DatagramPacket udpPacket = new DatagramPacket(bb, packet.sender());  // Using this line succeeds
    ctx.write(udpPacket);  // Exception is thrown here
}

我做错了什么?感谢您的帮助.

What am I doing wrong? Thanks for any help.

完全例外:

[nioEventLoopGroup-2-1] WARN io.netty.util.ReferenceCountUtil - Failed to release a message: DatagramPacket(=> /127.0.0.1:54169, PooledUnsafeDirectByteBuf(freed))
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:110)
    at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:98)
    at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84)
    at io.netty.channel.DefaultAddressedEnvelope.release(DefaultAddressedEnvelope.java:101)
    at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84)
    at io.netty.util.ReferenceCountUtil.safeRelease(ReferenceCountUtil.java:109)
    at io.netty.channel.ChannelOutboundBuffer.remove0(ChannelOutboundBuffer.java:296)
    at io.netty.channel.ChannelOutboundBuffer.failFlushed(ChannelOutboundBuffer.java:621)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:869)
    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:787)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:779)
    at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:760)
    at com.foobar.uservices.initial_receiver.InitialReceiverHandler.channelReadComplete(InitialReceiverHandler.java:24)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:409)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:391)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelReadComplete(AbstractChannelHandlerContext.java:384)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelReadComplete(DefaultChannelPipeline.java:1339)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:409)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelReadComplete(AbstractChannelHandlerContext.java:391)
    at io.netty.channel.DefaultChannelPipeline.fireChannelReadComplete(DefaultChannelPipeline.java:932)
    at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:97)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:651)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:574)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:488)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:450)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
    at java.lang.Thread.run(Thread.java:745)

推荐答案

很难从您的代码中看出来,但是您似乎正在使用SimpleChannelInboundHandler,它会自动释放所有传入的消息.由于要传递相同的缓冲区(只是包装不同),因此需要在缓冲区上执行ReferenceCountUtil.retain().

Hard to tell from your code but looks like you are probably using a SimpleChannelInboundHandler which automatically releases any incoming messages. Since you are passing the same buffer (just wrapped differently) you need to do a ReferenceCountUtil.retain() on the buffer.

注释掉的行成功,因为它是初始缓冲区的副本,因此将拥有自己的引用计数.

The commented out line succeeds because it is a copy of the initial buffer and thus will have it's own reference count.

文档: https://netty.io/4.0/api/io/netty/channel /SimpleChannelInboundHandler.html

这篇关于新手:发出警告:WARN io.netty.util.ReferenceCountUtil-无法发布消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆