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!
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