Netty 4.0 ByteBuf сохраняет () использовать - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь понять протокол декодирования aTrack, основанный на реализации https://github.com/traccar/traccar, они используют Netty для реализации своей платформы, но я не понимаю, как использовать метод retain объекта ByteBuf.Они использовали его в этом методе:

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);
    }
}

Кто-нибудь может объяснить мне, как работает метод rete () ByteBuf?

спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

Из книги Netty в действии :

В случае кодеров и декодеров, после того, как сообщение было закодировано или декодировано, оно будет автоматически освобождено вызовомдо ReferenceCountUtil.release(message).Если вам нужно сохранить ссылку для последующего использования, вы можете позвонить ReferenceCountUtil.retain(message).Это увеличивает счетчик ссылок, предотвращая освобождение сообщения.

В качестве дальнейшего примечания о том, что такое подсчет ссылок, это поможет:

Подсчет ссылокметодика оптимизации использования памяти и производительности путем освобождения ресурсов, удерживаемых объектом, когда на него больше не ссылаются другие объекты.Экземпляр реализации ReferenceCounted обычно запускается с активным счетчиком ссылок 1. Если счетчик ссылок больше 0, объект гарантированно не будет освобожден.Когда количество активных ссылок уменьшится до 0, экземпляр будет освобожден.Обратите внимание, что освобожденный объект больше не должен быть доступен для использования.

...