Skip to content

NettyServerHandler类的一个不恰当的对btyebuf的引用释放 #2

@zzzczh

Description

@zzzczh

NettyServerHandler类的channelRead0最后会对msg进行引用释放,这是不正确的。如下打印一下方法返回值可见是false。跟进方法源码会发现因为类型都不对,会直接返回false。

@Override
 protected void channelRead0(ChannelHandlerContext ctx, RpcRequest msg) throws Exception {
     try {
         if(msg.getHeartBeat()) {
             logger.info("接收到客户端心跳包...");
             return;
         }
         logger.info("服务器接收到请求: {}", msg);
         Object result = requestHandler.handle(msg);
         if (ctx.channel().isActive() && ctx.channel().isWritable()) {
             ctx.writeAndFlush(RpcResponse.success(result, msg.getRequestId()));
         } else {
             logger.error("通道不可写");
         }
     } finally {
         boolean isok = ReferenceCountUtil.release(msg);
         logger.info(String.valueOf(isok));
     }
 }

正确的做法应该是在上一个入站handler即最后使用btyebuf的地方进行释放

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions