2015-02-02 5 views
7

In Netty 4 "proxy" example, l'auto del canale leggere opzione è stata disattivata:Perché Netty 4 "proxy" esempio ha per impostare canale "AUTO_READ" come falsa

serverBootStrap.group(bossGroup, workerGroup) 
    ... 
    .childOption(ChannelOption.AUTO_READ, false) 

Se commentato childOption(ChannelOption.AUTO_READ, false), l'esempio proxy non può funzionare . E più dettagliato, nel metodo channelRead della classe HexDumpProxyFrontendHandler, il outboundChannel sarà sempre inattivo.

E ho studiato Netty codice sorgente, ha rilevato che "auto leggere" influenzerà come quello nei metodi fireChannelActive e fireChannelReadComplete della classe DefaultChannelPipeline

if (channel.config().isAutoRead()) { 
    read(); 
} 

Ma io ancora non riesco a capire quale sia il rapporto tra la lettura automatica e l'esempio del proxy. Nella mia mente, quando un dato invia al buffer in entrata, Netty dovrebbe attivare l'evento di lettura del canale.

Quindi ci sono due domande:

  • Perché disabilita lettura automatica è necessario ad esempio "proxy"?
  • Perché abilitare la lettura automatica renderà outboundChannel sempre inattivo?

risposta

6

se non si imposta il ripristino automatico su false, è possibile che si verifichino problemi se un canale scrive molti dati prima che l'altro possa consumarlo. Dato che è tutto asincrono, potresti finire con i buffer di molti dati e colpire OOME.

+0

Potrebbe essere se l'esecuzione automatica è vera causerà OOME. Ma perché abilitare questa opzione renderà l'esempio del proxy Netty non può funzionare completamente? –

+1

il problema è che se non lo si imposta a false si può iniziare a leggere prima di essere connessi al peer remoto. –

+0

Ciao Maurer, Quindi intendi che l'opzione di lettura automatica è vera renderà il metodo "fireChannelActive" per richiamare l'evento di lettura del canale prima che questo canale sia realmente attivo. Quindi perché l'evento di lettura è accaduto troppo presto, quindi i dati saranno mancanti. La mia comprensione è giusta? –