io.netty.util.IllegalReferenceCountException: refCnt: 0 at io.netty.handler.codec.mqtt.MqttPublishMessage.content(MqttPublishMessage.java:49) at io.netty.handler.codec.mqtt.MqttPublishMessage.release(MqttPublishMessage.java:95) at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84) at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:112) at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:163) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:155) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263) at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:163) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:155) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:950) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:510) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:467) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:381) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:353) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) at java.lang.Thread.run(Thread.java:745)
上面的是报错信息.
下面是PublishHandler 代码, 它前面还有一个ConnectHandler
@Override protected void channelRead0(ChannelHandlerContext ctx, MqttMessage msg) throws Exception { if (msg instanceof MqttPublishMessage) { MqttPublishMessage publishMessage = (MqttPublishMessage) msg; try { doPublish(publishMessage); int messageId = publishMessage.variableHeader().messageId(); MqttPubAckMessage ack = buildPubAck(messageId); sendResponse(ctx, ack); } finally { publishMessage.retain(); //publishMessage.release(); } } else { ctx.fireChannelRead(msg); } }
看finlly里面的, 我一开始写的是publishMessage.release(), 因为, 这个时候, 这个message已经不需要, 根据没有其他地方再使用了就销毁的原因, 我让他释放. 合乎逻辑啊.
但是为什么是publicMessage.retain()呢? 这不是将message的引用计数加1 吗? 本来是1现在是2, 哪里会去减呢?
2. 另外, 这里的报错信息,没有我的业务类的任何信息,我怎么调试啊, 调试了半天没有找到?
请大家帮忙看看
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。