2016-12-08 4 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

ありがとうございます! –

関連する問題