Netty 4.0 ByteBuf keep()使用

时间:2018-10-18 21:44:30

标签: java sockets netty

我正在尝试了解基于https://github.com/traccar/traccar实现的解码aTrack协议,他们将Netty用于其平台实现,但是我并不理解,这是使用ByteBuf对象的keep方法。他们在这种方法中使用了它:

protected Object decode(
        Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {

    ByteBuf buf = (ByteBuf) msg;

    if (buf.getUnsignedShort(buf.readerIndex()) == 0xfe02) {
        if (channel != null) {
            channel.writeAndFlush(new NetworkMessage(buf.retain(), remoteAddress)); // keep-alive message
        }
        return null;
    } else if (buf.getByte(buf.readerIndex()) == '$') {
        return decodeInfo(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII).trim());
    } else if (buf.getByte(buf.readerIndex() + 2) == ',') {
        return decodeText(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII).trim());
    } else {
        return decodeBinary(channel, remoteAddress, buf);
    }
}

有人可以向我解释ByteBuf keep()方法的工作原理吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

摘自Netty in action书:

  

对于编码器和解码器,一旦消息被编码或解码,将通过调用ReferenceCountUtil.release(message)自动释放该消息。如果需要保留参考供以后使用,可以致电ReferenceCountUtil.retain(message)。这样会增加引用计数,从而防止消息被释放。

作为参考计数的进一步说明,这将有所帮助:

  

引用计数是一种通过以下方式优化内存使用和性能的技术:   当某个对象不再被其他对象引用时,释放该对象所拥有的资源。 ReferenceCounted实现实例通常以活动引用计数1开始。只要引用计数大于0,就可以保证不会释放该对象。当活动引用的数量减少到0时,实例将被释放。请注意,已释放的对象将不再可用。