这是我的代码示例,正如我在标题中所说,当并发级别很高时,isWritable() 返回很多错误。
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().
,也就是说,它只是一个语法糖。
这意味着这不是原子操作,因此(可能)在此方法执行过程中多个线程之间存在上下文切换,因此您的写入不是立即刷新,因此 channel 的缓冲区已满。
关于java - netty channel.iswritable() 返回 false,当并发级别高时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036332/