java - netty channel.iswritable() 返回 false,当并发级别高时

标签 java netty

这是我的代码示例,正如我在标题中所说,当并发级别很高时,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/

相关文章:

java - Spring + Kerberos + 可信域

java - 如何跳过某些处理程序并直接转到netty中的特定处理程序

java - 核心游戏逻辑循环将数据发送到 Netty 中的 channel

java - javax.validation.ConstraintValidator 中的 Guice 多重绑定(bind)注入(inject)

java - TextView 未在 Android 中设置文本

java - Netty 4 中导致 BlockingOperationException 的原因是什么?

java - javapan最大websocket帧大小?

java - 如何解码 http 请求的响应并在 netty 中使用内容?

java - "Implicit wait"等待元素可点击、显示或可见

java - 这些 java 类是否具有从 JSON 文件映射的正确结构?