netty channel.iswritable() returns false,并发级别高时
netty channel.iswritable() returns false, when concurrent level is high
这是我的代码示例,正如我在标题中所说,当并发级别很高时,isWritable() returns much false.
if (channel.isWritable()) {
ChannelFuture future = channel.writeAndFlush(data);
if (future.cause() != null) {
data.release();
throw new IOException(future.cause().toString());
}
future.addListener(writeCallback);
}
我希望有人能解释为什么会发生这种情况,因为据我所知,它发生在我写入但没有刷新它时,所以缓冲区大小增加到超过 WRITE_BUFFER_HIGH_WATER_MARK 大小。但是如你所见,我使用的是writeAndFlush(),所以我不明白哪里错了?
当 cpu 太忙以至于它在刷新缓冲区之前写入了太多消息时会发生这种情况吗?
希望有人能帮助我,谢谢!
正如 writeAndFlush(Object msg)
javadoc 中所述:Shortcut for call write(Object) and flush().
,也就是说,它只是一个语法糖。
这意味着这是不是一个原子操作,因此(可能)在这个中间有多个线程之间的上下文切换方法执行,因此您的写入不会立即刷新,因此通道的缓冲区已满。
这是我的代码示例,正如我在标题中所说,当并发级别很高时,isWritable() returns much false.
if (channel.isWritable()) {
ChannelFuture future = channel.writeAndFlush(data);
if (future.cause() != null) {
data.release();
throw new IOException(future.cause().toString());
}
future.addListener(writeCallback);
}
我希望有人能解释为什么会发生这种情况,因为据我所知,它发生在我写入但没有刷新它时,所以缓冲区大小增加到超过 WRITE_BUFFER_HIGH_WATER_MARK 大小。但是如你所见,我使用的是writeAndFlush(),所以我不明白哪里错了?
当 cpu 太忙以至于它在刷新缓冲区之前写入了太多消息时会发生这种情况吗?
希望有人能帮助我,谢谢!
正如 writeAndFlush(Object msg)
javadoc 中所述:Shortcut for call write(Object) and flush().
,也就是说,它只是一个语法糖。
这意味着这是不是一个原子操作,因此(可能)在这个中间有多个线程之间的上下文切换方法执行,因此您的写入不会立即刷新,因此通道的缓冲区已满。