2017-02-01 6 views
0

Я использую ByteToMessageCodec в своем проекте netty. Закодировать имеет следующую структуру:Как правильно работать с ByteToMessageCodec.encode и прямыми буферами

protected abstract void encode(
    ChannelHandlerContext ctx, 
    I msg, 
    ByteBuf out 
) throws Exception 

В моем случае msg это сообщение, которое держит directBuffer, которые пришли из другого канала и должен быть направлен.

Мои вопросы:

  • Что является лучшей практики, если out.isWritable() ложно?
  • out.writeBytes(myMessage.directBuffer) копировать память, если out также является прямым буфером?
  • Если он копирует память, могу ли я просто позвонить ctx.writeAndFlush(myMessage.directBuffer), чтобы предотвратить копирование памяти?

Существует source by norman maurer, рассказывающий что-то об этой точной теме, но, похоже, память копирует буферы и не отвечает на все мои вопросы.

ответ

1

Вы не должны использовать ByteToMessageCodec на всех и просто использовать MessageToMessageEncoder в этом случае:

Тогда вы могли бы сделать:

protected abstract void encode(ChannelHandlerContext ctx, I msg, List<Object> out) { 
    out.add(msg.directBuffer); 
} 

Это предотвратит любые копии памяти.

+0

Могу ли я также копировать память, если я использую CompositeBuffers, заполненный прямыми буферами? –

+0

да, если все они прямые –

 Смежные вопросы

  • Нет связанных вопросов^_^