2013-01-20 13 views
7

netty nio lib를 사용하여 Java로 개발 한 다운로드 클라이언트의 경우 대역폭 제한 기능도 구현했습니다. 엄밀히 말하면 GlobalTrafficShapingHandler 객체를 통해 처리합니다. 이 클래스의 JavaDoc을 기반으로 다음과 같이 nio 클라이언트 파이프 라인을 초기화합니다.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; 
} 

그리고 런타임 중에 최대 값을 설정합니다. 다운로드 속도는

입니다. 따라서 기본적으로 netio nio 기능은 훌륭하고 빠르게 작동합니다. 최대치를 설정할 때. 응용 프로그램에서 다운로드 속도, 나는 또한 대역폭 사용량이 실제로 최대에서 모자를 볼 수 있습니다. 수평. 나는 대역폭 사용을 모니터한다 :

trafficHandler.getTrafficCounter().getLastReadThroughput(); 

그러나, 불행하게도 최대. 내가 모니터 한 속도는 이전에 설정 한 것, 심지어 닫히지 않은 것입니다. 예를 들어, 원래 (제한 없음) 다운로드 속도는 약 2000kb/s입니다. 그런 다음 위에서 설명한대로 300kb/s로 제한을 설정했지만 실제 다운로드 속도는 700-900kb/에스.

이 경우 내 문제는 다음과 같습니다. 트래픽 셰이퍼가 뭔가를하고 있지만 원하는대로 볼 수 없습니다. 여기서 예를 들어 파이프 라인 초기화의 단계를 놓치고 있습니까?

미리 도움 주셔서 감사합니다.

답변

0

좋습니다. 다른 아이디어가없는 것 같습니다.
나에게 조금 도움이 된 유일한 점은 타이밍 카운터를 5-10 초로 늘리는 것이 었습니다.

건배!

0

getPipeline()은 새 파이프 라인이 요청 될 때마다 GlobalTrafficShapingHandler을 인스턴스화합니다. 인스턴스를 생성하고 모든 파이프 라인에서 다시 사용해야합니다. HashedWheelTimer과 같은 다른 클래스에도 해당됩니다.

Netty에는 파이프 라인간에 공유해야하는 꽤 많은 클래스가 있습니다. 보통 문서에이 점에 대해 분명하게 언급되어 있습니다. 각 클래스의 javadoc을 검사하고 그 클래스를 따르고 있는지 확인해야합니다.

+0

물론 당신은 내 코드에서 제안한대로 실제로했습니다. GlobalTrafficShapingHandler, HashedWheelTimer 및 ExecutionHandler는 클래스 생성자에서 전에 만들어집니다. 미안 원래 게시물이 당신을 혼란스럽게했다면. 그에 맞게 업데이트했습니다. – Matthias