2016-12-08 1 views
1

Hier ist mein Codebeispiel, wie ich im Titel sagte, wenn die gleichzeitige Ebene hoch ist, gibt isWritable() viel falsch zurück.netty channel.iswritable() gibt false zurück, wenn gleichzeitig level hoch ist

if (channel.isWritable()) { 
     ChannelFuture future = channel.writeAndFlush(data); 
     if (future.cause() != null) { 
      data.release(); 
      throw new IOException(future.cause().toString()); 
     } 
     future.addListener(writeCallback); 
    } 

Und ich wünsche mir jemand erklären kann, warum dies so weit geschieht verursachen, wie ich weiß, es geschah, als ich schrieb, aber nicht so die Puffergröße auf mehr als die WRITE_BUFFER_HIGH_WATER_MARK Grösse gespült. Aber wie Sie sehen können, verwende ich writeAndFlush(), also verstehe ich nicht, wo es falsch ist?

Kann dies passieren, wenn CPU zu beschäftigt ist, dass es zu viele Nachrichten schreibt, bevor es den Puffer spült?

Hoffe jemand kann mir helfen, Danke!

Antwort

4

Wie in writeAndFlush(Object msg) javadoc: Shortcut for call write(Object) and flush(). angegeben ist, ist es nur ein syntaktischer Zucker.

Es bedeutet dies nicht ein Atom Betrieb ist, daher gibt (möglicherweise) sind kontext mehrere Threads in der Mitte dieser Methodenausführung wechselt zwischen, so sind Ihre Schreibvorgänge nicht sofort ausgespült und damit die Puffer des Kanals erhält ausgefüllt.

+0

Danke, das macht Sinn! –