对于我使用netty nio lib在
Java中开发的下载客户端,我还实现了带宽限制功能.从技术上讲,我是通过GlobalTrafficShapingHandler对象完成的.基于这个类’JavaDoc我初始化nio客户端管道如下:
...
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;
}
然后在运行时我设置最大值.通过下载速度
public void setDlSpeedLimit(long limit)
{
if(limit < 0)
return;
trafficHandler.configure(0, limit * 1000L);
}
好吧,所以基本上netty nio功能运行得很好而且速度很快.当我设置最大值.在应用程序中下载速度,我还可以看到带宽使用确实上限为最大值.水平.我监视带宽使用情况
trafficHandler.getTrafficCounter().getLastReadThroughput();
然而,不幸的是最大.速度我监控不是我之前设置的,甚至没有关闭.例如,我最初(没有限制)的下载速度约为2000 kb / s,然后我将限制设置为300 kb / s,如上所述,但实际下载速度则从700-900 kb /秒.
所以我在这种情况下的问题是:我可以看到流量整形器正在做某事,但不是我想要的.我在这里错过了什么,例如管道初始化中的任何步骤?
在此先感谢您的帮助!