2013-01-20 9 views
7

Für einen Download-Client, den ich in Java unter Verwendung der netty nio lib entwickelt habe, habe ich auch eine Bandbreitenbeschränkung implementiert. Technisch mache ich das über ein GlobalTrafficShapingHandler-Objekt. Auf der Grundlage dieser Klasse JavaDoc initialisieren ich die nio Pipeline-Client wie folgt:Wie schränkt man die Bandbreite mit Java netty korrekt ein?

... 
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; 
} 

Und während der Laufzeit Ich habe dann die max. Download-Geschwindigkeit über

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

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

Ok, also im Grunde funktioniert die netto nio-Funktionalität gut und schnell. Wenn ich den max. Download-Geschwindigkeit in der Anwendung, kann ich auch sehen, dass die Bandbreitennutzung tatsächlich auf eine max. Niveau. Ich überwache die Bandbreitennutzung über

Aber leider ist die max. Geschwindigkeit überwache ich nicht, was ich vorher eingestellt habe, nicht mal nah dran. Zum Beispiel habe ich ursprünglich (ohne Limit) eine Download-Geschwindigkeit von ungefähr 2000 kb/s, dann setze ich das Limit auf 300 kb/s, wie oben beschrieben, aber die tatsächliche Download-Geschwindigkeit variiert dann von 700-900 kb/s. s.

Also mein Problem in diesem Fall ist: Ich kann sehen, dass der Traffic Shaper etwas tut, aber nicht so, wie ich es wollte. Verpasse ich hier etwas, irgendeinen Schritt in der Pipeline-Initialisierung zum Beispiel?

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

0

Ok, so scheint es, gibt es keine anderen Ideen.
Die einzige Sache, die mir ein bisschen half, war, den Zeitzähler auf 5-10 Sekunden zu erhöhen.

Prost!

0

Ihre getPipeline() Instanziierung GlobalTrafficShapingHandler jedes Mal, wenn eine neue Pipeline angefordert wird. Sie sollten nur einen instanziieren und stattdessen in allen Pipelines wiederverwenden. Dies gilt auch für andere Klassen, z. B. HashedWheelTimer.

Netty hat einige Klassen, die unter Pipelines aufgeteilt werden müssen. Normalerweise wird in der Dokumentation deutlich darauf hingewiesen. Sie sollten das Javadoc jeder Klasse untersuchen und sicherstellen, dass Sie ihnen folgen.

+0

Sie haben natürlich Recht, in Wirklichkeit tat ich, wie Sie in meinem Code vorgeschlagen. Der GlobalTrafficShapingHandler, der HashedWheelTimer und der ExecutionHandler werden zuvor im Klassenkonstruktor erstellt. Entschuldigung, wenn mein ursprünglicher Beitrag Sie in dieser Hinsicht verwirrt hat. Ich habe es entsprechend aktualisiert. – Matthias