2016-04-19 12 views
0

Die Code-Snippet haben ist:Ein Code-Snippet netty Beispiele aus netty.io scheint Bugs

 final ChannelFuture f = ctx.writeAndFlush(time); 
     f.addListener(new ChannelFutureListener() { 

      public void operationComplete(ChannelFuture future) { 
       assert f == future; 
       ctx.close(); 
      } 
     }); 

Was ist, wenn 'final ChannelFuture f geschieht = ctx.writeAndFlush (Zeit); 'führt sehr schnell aus, so dass der nächste addListener Code noch nicht startet. Wenn die erste Codezeile abgeschlossen ist, benachrichtigt der Thread alle Listener, dass die Operation ausgeführt wurde, aber zu diesem Zeitpunkt gibt es überhaupt keinen Listener! Danach wird ein neuer Listener hinzugefügt, aber es werden keine Benachrichtigungen mehr empfangen!

-Code Quelle: http://netty.io/wiki/user-guide-for-5.x.html

Antwort

2

Der ChannelFuture behält seinen Vollendungszustand so, wenn ein Zuhörer nach Abschluss hinzugefügt wird, die „spät“, fügten Zuhörer bei der Zugabe sofort wieder aufgerufen wird.

Siehe javadoc für ChannelFuture.addListener(GenericFutureListener), speziell der Kommentar:

Wenn diese Zukunft bereits abgeschlossen ist, der angegebene Listener ist sofort benachrichtigt.

Siehe impl für DefaultPromise. Spätere Listener (d. H. Listener, die hinzugefügt werden, sobald die Zukunft abgeschlossen ist) haben ihren eigenen Handler (notifyLateListener).

+0

Führt dies zu OutOfMemoryError, wenn der Benutzer vergessen hat, mindestens einen Listener hinzuzufügen? –

+0

Die Zukunft ist Müll gesammelt, sobald es unerreichbar ist, und der Staat ist ziemlich klein, so würde ich sagen, ein OOM ist unwahrscheinlich, es sei denn, Sie gehen aus dem Weg zu Futures in einer Sammlung oder dergleichen. – Nicholas

+0

Diese Erklärung konnte mich jedoch irgendwie nicht überzeugen. Hast du die Quellcodes gelesen? ChannelFuture weiß nicht, wann ein Listener hinzugefügt wird, und weiß auch nicht, wann es das zukünftige Ergebnis für GC-Zwecke freigeben soll, da es gemäß Ihrer Erklärung auf Listener warten würde. –