2017-02-01 14 views
0

我在我的netty项目中使用ByteToMessageCodec。编码具有以下结构:如何正确使用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

是的,只要这些都是直接的 –