2013-01-20 8 views
7

Per un client di download che ho sviluppato in Java utilizzando la netty lib di netty, ho implementato anche una funzione di limitazione della larghezza di banda. Tecnicamente lo faccio tramite un oggetto GlobalTrafficShapingHandler. Sulla base di questa classe JavaDoc ho inizializzare il gasdotto cliente nio come segue:Come limitare correttamente l'utilizzo di bandwith con Java netty?

... 
trafficHandler = new GlobalTrafficShapingHandler(
     new HashedWheelTimer(), 0, 0, 1000); 
execHandler = new ExecutionHandler(
     new OrderedMemoryAwareThreadPoolExecutor(20, 0, 0)); 
... 

public ChannelPipeline getPipeline() throws Exception 
{ 
    // create default pipeline 
    ChannelPipeline pipeline = pipeline(); 

    // traffic shaping handler 
    pipeline.addLast("global-traffic-shaping", trafficHandler); 

    // SSL support 
    if(useSSL) 
    { 
     SSLEngine sslEngine = createSSLEngine(); 
     pipeline.addLast("ssl", new SslHandler(sslEngine)); 
    } 

    // memory executor 
    pipeline.addLast("memory-executor", execHandler); 

    // business logic 
    pipeline.addLast("data-processing", 
     new NettyNioClientHandler(
      nettyNioClient, localer, logger, ncMgr, username, useSSL)); 

    return pipeline; 
} 

E durante il runtime Ho quindi impostare il max. velocità di download via

public void setDlSpeedLimit(long limit) 
{ 
    if(limit < 0) 
     return; 

    trafficHandler.configure(0, limit * 1000L); 
} 

Ok, quindi in pratica la funzionalità di nino nino funziona bene e velocemente. Quando imposto il massimo velocità di download nell'applicazione, posso anche vedere che l'utilizzo della larghezza di banda è effettivamente limitato a un massimo. livello. Controllo l'utilizzo della banda via

trafficHandler.getTrafficCounter().getLastReadThroughput(); 

Tuttavia, sfortunatamente il max. La velocità che controllo non è quella che ho impostato prima, nemmeno vicino. Ad esempio, originariamente (senza limiti) ho una velocità di download di circa 2000 kb/s, quindi imposto il limite a 300 kb/s come descritto sopra, ma la velocità di download reale varia da 700-900 kb/S.

Quindi il mio problema in questo caso è: posso vedere che il traffic shaper sta facendo qualcosa, ma non come volevo. Mi manca qualcosa qui, ad ogni passo nell'inizializzazione della pipeline, ad esempio?

Grazie in anticipo per il vostro aiuto!

risposta

0

Ok, sembra che non ci siano altre idee.
L'unica cosa che mi ha aiutato un po 'è stato aumentare il contatore dei tempi a 5-10 secondi.

Cheers!

0

Il getPipeline() crea un'istanza di GlobalTrafficShapingHandler ogni volta che viene richiesta una nuova pipeline. Dovresti solo istanziarne uno e riutilizzarlo in tutte le condutture. Questo vale anche per altre classi, ad esempio HashedWheelTimer.

Netty ha alcune classi che devono essere condivise tra le condutture. Di solito la documentazione menziona chiaramente questo. Dovresti esaminare javadoc di ogni classe e assicurarti di seguirli.

+0

Ovviamente hai ragione, in realtà ho fatto come hai suggerito nel mio codice. GlobalTrafficShapingHandler, HashedWheelTimer ed ExecutionHandler vengono creati precedentemente nel costruttore della classe. Scusa se il mio post originale ti ha confuso a riguardo. L'ho aggiornato di conseguenza. – Matthias

Problemi correlati