Netty ByteBuf для byte [] декодера - PullRequest
0 голосов
/ 27 марта 2019

Я хочу преобразовать входящее сообщение Нетти ButeBuf в экземпляр MyBuffer моего класса.Для этого я использую это MessageToMessageDecoder:

class ByteArrayDecoder extends MessageToMessageDecoder<ByteBuf> {
  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
    int length = msg.readableBytes();
    if (msg.hasArray()) {
      out.add(new MyBuffer(msg.array(), msg.arrayOffset(), length));

    } else {
      byte[] bytes = new byte[length];
      msg.getBytes(msg.readerIndex(), bytes);
      out.add(new MyBuffer(bytes, 0, length));
    }
  }
}

Теперь, так как сообщение ByteBuf является подсчетом ссылок, мы должны выпустить его после того, как с ним закончим.Это делается автоматически с помощью MessageToMessageDecoder, который мы расширяем.

Теперь, когда ButeBuf выпущен, не означает ли это, что резервный массив находится в опасности?Он будет переработан, и я не уверен, что тогда я увижу в массиве моего MyBuffer.

Безопасен ли этот декодер для использования и это правильный способ его записи?

1 Ответ

2 голосов
/ 30 марта 2019

За предложение @Ferrybig, я делаю свой комментарий ответом!

ByteBuf.array () возвращает фактический резервный массив, как вы указали ...

Как только вы отказались от своего дескриптора / ссылки на него, и после этого счетчик ссылок упал до 0 (либо сразу, либо когда все остальное откажется от его требования), все ставки отменяются.

Если вам нужно сохранить то, что находится в буфере, тогда ваш MyBuffer должен будет взять копию массива, который он получает в своем конструкторе.

Я был укушен этим раньше, когда массив был переназначен wayyyy после того, как я первоначально использовал его. Когда я вернулся к этому - бум - он был повторно использован, и мои данные исчезли.

Так что, возможно, стоит добавить флаг «copy» в конструктор MyBuffer, указывающий, нужно ли копировать входящий массив или нет.

...