对于我使用netty nio lib在
Java中开发的下载客户端,我还实现了带宽限制功能.从技术上讲,我是通过GlobalTrafficShapingHandler对象完成的.基于这个类’JavaDoc我初始化nio客户端管道如下:
... trafficHandler = new GlobalTrafficShapingHandler( new HashedWheelTimer(),1000); execHandler = new ExecutionHandler( new OrderedMemoryAwareThreadPoolExecutor(20,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 /秒.
所以我在这种情况下的问题是:我可以看到流量整形器正在做某事,但不是我想要的.我在这里错过了什么,例如管道初始化中的任何步骤?
在此先感谢您的帮助!
解决方法
每次请求新管道时,getPipeline()都会实例化GlobalTrafficShapingHandler.您应该只实例化一个并在所有管道中重复使用它.其他类也是如此,例如HashedWheelTimer.
Netty有很多类必须在管道之间共享.通常文档清楚地提到了这一点.您应该检查每个类的javadoc,并确保您遵循它们.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。