如何正确使用 ByteToMessageCodec.encode 和直接缓冲区
How do I correctly work with ByteToMessageCodec.encode and direct buffers
我在我的 netty 项目中使用 ByteToMessageCodec。编码具有以下结构:
protected abstract void encode(
ChannelHandlerContext ctx,
I msg,
ByteBuf out
) throws Exception
在我的例子中,msg
是一条包含 directBuffer 的消息,该缓冲区来自另一个通道,将被转发。
我的问题:
- 如果
out.isWritable()
为假,最佳做法是什么?
- 如果
out
也是直接缓冲区,out.writeBytes(myMessage.directBuffer)
是否复制内存?
- 如果确实复制了内存,我可以只调用
ctx.writeAndFlush(myMessage.directBuffer)
来阻止内存复制吗?
有一个 source by norman maurer 讲述了关于这个确切主题的一些事情,但它似乎记忆复制了缓冲区并且没有回答我所有的问题。
您根本不应该使用 ByteToMessageCodec,在这种情况下只需使用 MessageToMessageEncoder
:
那么你可以这样做:
protected abstract void encode(ChannelHandlerContext ctx, I msg, List<Object> out) {
out.add(msg.directBuffer);
}
这将防止任何内存复制。
我在我的 netty 项目中使用 ByteToMessageCodec。编码具有以下结构:
protected abstract void encode(
ChannelHandlerContext ctx,
I msg,
ByteBuf out
) throws Exception
在我的例子中,msg
是一条包含 directBuffer 的消息,该缓冲区来自另一个通道,将被转发。
我的问题:
- 如果
out.isWritable()
为假,最佳做法是什么? - 如果
out
也是直接缓冲区,out.writeBytes(myMessage.directBuffer)
是否复制内存? - 如果确实复制了内存,我可以只调用
ctx.writeAndFlush(myMessage.directBuffer)
来阻止内存复制吗?
有一个 source by norman maurer 讲述了关于这个确切主题的一些事情,但它似乎记忆复制了缓冲区并且没有回答我所有的问题。
您根本不应该使用 ByteToMessageCodec,在这种情况下只需使用 MessageToMessageEncoder
:
那么你可以这样做:
protected abstract void encode(ChannelHandlerContext ctx, I msg, List<Object> out) {
out.add(msg.directBuffer);
}
这将防止任何内存复制。