java—当channeloutboundbuffer已满时写操作会发生什么

nbewdwxp  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(355)

我试图弄清楚当一个通道没有响应时,写请求会发生什么。例如,当对等方突然从网络上掉下来时,我们就再也没有rst了。
从阅读文档和理解netty channel buffers和watermarks可以看出,一旦达到高writerbufferwatermark,channeloutboundbuffer将被视为已满,并且:
channel.iswritable()将开始返回false。
从channel.iswritable():
当且仅当i/o线程将立即执行请求的写操作时,返回true。此方法返回false时发出的任何写请求都将排队,直到i/o线程准备好处理排队的写请求为止。
我最初的问题是:当我们继续写作的时候会发生什么?
如果netty channel iswriteable返回false表示存在内部缓冲区,并暗示它是无界的,那么数据将在哪里排队。
问题是,写请求到底排在哪里,更重要的是,我可以观察这些队列的大小吗?
或者:当netty/os检测到连接断开并且需要关闭时,是否有一些限制?

8i9zcol2

8i9zcol21#

它仍将排队等候 ChannelOutboundBuffer . 一旦缓冲区满了,你就有责任停止写,然后再开始写一次。你可以通过 ChannelInboundHandler.channelWritabilityChanged(...) .

b91juud3

b91juud32#

查看4.1.37中channeloutboundbuffer的源代码,方法 addMessage 始终将传入的消息添加到内部链接列表,而不考虑 isWritable . 此列表无限增长。
此缓冲区的总字节长度可通过 channel.unsafe().outboundBuffer().totalPendingWriteBytes() .
对于间接值,如果不想使用unsafe(),也可以使用 channel.bytesBeforeWritable() 它将返回队列字节减去低水位线。

相关问题