我想将传入的Netty的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的数组中看到什么。
此解码器可以安全使用吗,这是编写它的正确方法吗?
答案 0 :(得分:2)
根据@Ferrybig的建议,我的评论是一个答案!
ByteBuf.array()返回您指定的实际后备数组...
一旦您放弃了对它的处理/引用,并且引用计数随后下降到0(立即或在其他所有事情都放弃了它的要求时),所有的赌注都将关闭。
如果需要维护缓冲区中的内容,则MyBuffer将必须获取在其构造函数中接收到的数组的副本。
在我最初使用它后,在数组被重新分配用途之前,我对此一直感到吃力。当我回到繁荣时期时,它已经被重用,我的数据也消失了。
因此可能值得在MyBuffer的构造函数中添加一个“ copy”标志,以指示入站数组是否需要复制。