2016-12-08 33 views
1

這裏是我的代碼示例,正如我在標題中所說的,當併發級別較高時,isWritable()返回的false很多。netty channel.iswritable()在併發級別高時返回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太忙時,會發生這種情況,它會在刷新緩衝區之前寫入太多消息嗎?

希望有人能幫助我,謝謝!

回答

4

正如writeAndFlush(Object msg) javadoc:Shortcut for call write(Object) and flush().所述,即它只是一個語法糖。

這意味着這是一個原子操作,因此存在(可能)是在該方法中執行的中間的多個線程之間的上下文切換,所以你的寫入不立即刷新,因此,信道的緩衝區得到溢滿。

+0

謝謝,這很有道理! –