2016-10-15 17 views
0

Netty 4.1.6(Javaの1.8を使用して、Gradleからjcenter()経由でionetty: .0_102 on OS X 10.11.6)クレームこれは警告ですが、実際には自分のコードが正しいことをしない原因になります。 Nettyに全く新しいので、私は何かを悩ませているので、私は専門家に尋ねると思った。Newbie:警告を発しました:WARN io.netty.util.ReferenceCountUtil - メッセージの解放に失敗しました

私が取得:

[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 
} 

?助けてくれてありがとう。

全例外:

[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) 

答えて

2

あなたのコードから伝えるのは難しいが、あなたはおそらく、自動的にすべての着信メッセージを解放SimpleChannelInboundHandlerを使用しているように見えます。同じバッファを渡しているので(異なるラップだけ)、バッファ上でReferenceCountUtil.retain()を実行する必要があります。

コメントアウトされた行は、それが初期バッファのコピーであるため、それ自体の参照カウントを持つため、成功します。

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

関連する問題