当前位置: 首页 > 知识库问答 >
问题:

bytebuf在netty中的重用

濮阳赞
2023-03-14

我和Netty有一个http服务。对于一组请求,在http正文中只有“{}”的相同答复。我有一个想法,可以避免为每个这样的请求创建新的缓冲区,所以我使用了:

private static final ByteBuf EMPTY_REPLY = Unpooled.copiedBuffer("{}", CharsetUtil.UTF_8);

在我的SimpleChannelInboundHandler中。它只适用于第一个查询,之后我开始有

WARNING: Failed to mark a promise as success because it has failed already: DefaultChannelPromise@48c81b24(failure: io.netty.handler.codec.EncoderException: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1), unnotified cause:
io.netty.handler.codec.EncoderException: io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:106)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738)
    at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:801)
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)
    at travel.ServerHandler.writeResult(ServerHandler.java:475)

所以看起来缓冲区在第一次回复后会自动释放。有这样的缓冲的正确方法是什么?

共有1个答案

微生烨然
2023-03-14

共享Netty缓冲区时,需要遵循基本引用计数规则,而不是基本垃圾收集的简单规则。

这些规则基本上可以归结为:

  • 当从类中发送bytebuf时,调用reate()
  • 如果使用bytebuf,请调用release()

在调用.reate()之后,您还需要执行一个技巧,即调用.duplicate(),因为这样可以防止对读取器索引的修改传递到您的基副本,如果不这样做,就会出现第一次写入成功的问题,但是在此之后,所有后续的写入都将写入一个空缓冲区。

 类似资料:
  • 问题内容: 我无法通过阅读文档解决两个简单的问题: 我有一个 如何将其转换为? 我有一个NIO 如何将其转换为? 问题答案: 该文档对我来说似乎很清楚: 创建缓冲区 建议在Unpooled中使用辅助方法创建一个新的缓冲区,而不是调用单个实现的构造函数。 然后在中,您可以选择包装或复制。例如: 根据您是否希望将对返回值所做的更改传递到原始字节数组/缓冲区,选择适当的方法。

  • 我不完全理解ByteBuf的写和读方法实际上是如何工作的。对这两种方法的详细解释将是非常好的。谢谢

  • 如果我只是想在Netty应用程序中不使用ByteBuf。我使用创建一个ByteBuf,那么我必须在函数末尾调用吗?

  • 在我的项目中,我只使用nio字节缓冲,因为gwt支持这个,我想,gwt支持netty字节缓冲吗? 目前,我没有gwt env,但我希望这个项目支持gwt。 BTW、byteBuffer和bytebuf很容易通过这个注释相互转换。如果bytebuf内部只是使用byte缓冲区,那么,在gwt下就不会有问题。 有人能测试这个吗?

  • 我希望将传入的Netty的消息转换为我的类的实例。为此,我使用以下: 现在,由于消息是引用计数的,我们必须在处理完它之后释放它。这是由我们正在扩展的自动完成的。 现在,既然ButeBuf已经发布,这难道不意味着支持阵列处于危险之中吗?它将被回收,我不确定我会在我的MyBuffer的数组中看到什么。 这个解码器可以安全使用吗?这是正确的编写方式吗?

  • 该应用程序基于NETTY(这是一个需求)。 我的第一个想法是创建这样一个管道: (从解码到) (对)进行检查 (将编码为) (使用) 我怎样才能完成这项任务?避免对请求进行解码和重新编码会很好。 问候,马西米利亚诺