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