netty的一些坑

lddd 后端 2019-11-26

第一个:

Caused by: io.netty.util.IllegalReferenceCountException: refCnt: 0

at io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1441)

at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1425)

at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1411)

at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:888)

at io.netty.buffer.CompositeByteBuf.readBytes(CompositeByteBuf.java:2047)

这个bug是在通过长连接实现部分数据的跨请求保存,如果把前一个请求中的请求内容(ByteBuf)保存在通道上,下一次请求再来用的话就有可能报这种错(可能必现),这个时候需要将第一个请求的内容通过Unpooled.coppiedBuffer来拷贝一份,保存拷贝的内容到通道上,而不是网上说的用retain方法增加引用,然后用release释放,我在异步调用时发现在这种方法会偶尔报下面这种,而且服务运行不了多久就会down掉:

LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/w

iki/reference-counted-objects.html for more information.

Recent access records: 

第二个:

java.lang.NoSuchMethodError: io.netty.buffer.ByteBuf.forEachByte(Lio/netty/buffer/ByteBufProcessor;)I

        at io.netty.handler.codec.http.HttpObjectDecoder$LineParser.parse(HttpObjectDecoder.java:728)

        at io.netty.handler.codec.http.HttpObjectDecoder.decode(HttpObjectDecoder.java:198)

        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502)

        at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366)

        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278)

        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)

        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)

        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)

极其可能是jar包的冲突导致,根据之前可用的jar包来导入对应的jar包,一般只要netty的所有包版本一致应该不会有问题

Apipost 私有化火热进行中

评论