我正在尝试了解基于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);
}
}
谢谢。
答案 0 :(得分:2)
摘自Netty in action书:
对于编码器和解码器,一旦消息被编码或解码,将通过调用
ReferenceCountUtil.release(message)
自动释放该消息。如果需要保留参考供以后使用,可以致电ReferenceCountUtil.retain(message)
。这样会增加引用计数,从而防止消息被释放。
作为参考计数的进一步说明,这将有所帮助:
引用计数是一种通过以下方式优化内存使用和性能的技术: 当某个对象不再被其他对象引用时,释放该对象所拥有的资源。
ReferenceCounted
实现实例通常以活动引用计数1开始。只要引用计数大于0,就可以保证不会释放该对象。当活动引用的数量减少到0时,实例将被释放。请注意,已释放的对象将不再可用。